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 }
View Code

相关文章: