vfork 同 fork 的返回值是一样的,不同的地方是vfork通常创建子进程的目的是 exec一个新的程序,vfork不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用 exec 或者是 exit 于是就不会存在访问该空间。如果子进程在调用 exec 或者 exit 的时候,它是在父进程的空间中运行的。vfork 保证子进程先运行,它在exec 或 exit 之后,父进程才会被执行(如果子进程中依赖父进程的进一步操作,那么,悲剧了,死锁)
下面代码当子进程在 _exit 之前改变了变量 value 的值,父进程也改变了,这是因为vfork 出来的子进程是在父进程的地址空间运行的。 父进程没有 sleep 是因为 vfork 确保了子进程执行结束后,父进程才开始。
1
2 #include <unistd.h>
3 #include <stdio.h>
4 #include <sys/types.h>
5
6
7 int main(){
8 int value = 0;
9 int pid = vfork();
10 if(pid < 0){
11 puts("ERROR");
12 }else if(pid == 0){ //child
13 ++value;
14 printf("child father id:%d, value:%d\n", getppid(), value);
15 _exit(0); // child process is end; father process begin.
16 }else{ //parent
17 printf("father child id:%d, value:%d\n", pid, value);
18 }
19 return 0;
20 }
21
运行结果:
child father id:3072, value:1
father child id:3073, value:1