What is vfork ?

  • It’s a special case of a clone. It is used to create new processes without copying the page tables of the parent process.
  • calling thread is suspended until the child call execve or _exit.

Points To Remember

  • vfork()is an obsolete optimization.
  • Before good memory management, fork()made a full copy of the parent’s memory, so it was pretty expensive.
  • since in many cases a fork()was followed by `exec(), which discards the current memory map and creates a new one, it was a needless expense.
  • Nowadays, fork() doesn’t copy the memory; it’s simply set as “copy on write”, so fork()+exec()is just as efficient as vfork()+exec()
  • Some OSs, vfork shares same address space as of parents
  • vfork & fork internally calls clone

Example

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#define SIZE 5
int nums[SIZE] = {0, 1, 2, 3, 4};
int main()
{
        int i;
        pid_t pid;
        pid = vfork();
        if(pid == 0){  /* Child process */
                for(i = 0; i < SIZE; i++){
                        nums[i] *= -i;
                        printf("CHILD: %d \n", nums[i]);
                }
                _exit(0);
        }
        else if (pid > 0){  /* Parent process */
                wait(NULL);
                for(i = 0; i < SIZE; i++)
                        printf("PARENT: %d \n", nums[i]);
        }
        return 0;
}

Sample Output

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
CHILD: 0
CHILD: -1
CHILD: -4
CHILD: -9
CHILD: -16
PARENT: 0
PARENT: -1
PARENT: -4
PARENT: -9
PARENT: -16