vfork用于创建一个新进程,而该进程的目的就是exec一个新程序。vfork和fork均创建一个子进程,但是vfork并不将父进程的地址空间完全复制到子进程中,因为子进程会调用exec(或exit),于是也就不会访问改地址空间。在子进程调用exec或exit之前,它继续在父进程的空间中运行。
vfork和fork之间的另一个区别:vfork保证子进程先运行。在子进程调用exec或exit之后,父进程才可能被调度运行。
1 #include <stdlib.h> 2 #include <unistd.h> 3 #include <sys/types.h> 4 #include <stdio.h> 5 6 int global = 6; 7 8 int main() 9 { 10 int var; 11 pid_t pid; 12 13 var = 88; 14 printf("before vfork\n"); 15 printf("pid = %d, global = %d, var = %d\n", getpid(), global, var); 16 17 if ((pid = vfork()) < 0) 18 { 19 perror(" failed to vfork()!\n"); 20 return -1; 21 } 22 else if (pid == 0) 23 { 24 printf(" After vfork, and in child process:\n"); 25 printf(" pid = %d, global = %d, var = %d\n", getpid(), global, var); 26 27 global++; 28 var++; 29 _exit(0); 30 } 31 32 printf("\n\nAfter vfork, and in parent process:\n"); 33 printf(" pid = %d, global = %d, var = %d\n", getpid(), global, var); 34 35 return 0; 36 }