fork:拷贝了一份父进程的数据,也就是说父子之间互不干涉
vfork:与父进程共享同一份数据
程序参考:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void) {
int var;
var = 88;
pid_t pid;
if ((pid = fork()) < 0) {
printf("vfork error");
exit(-1);
} else if (pid == 0) { /* 子进程 */
var++;
printf("pid=%d,var=%d\n", getpid(), var);
return 0;
//exit(0);
}
printf("pid=%d,var=%d\n", getpid(), var);
return 0;
}
运行结果:
pid=4684,var=89
pid=4683,var=88
因为此处用的是fork,所以父子之间互不干涉。
子进程中的var加一后,变为89。
而父进程中的var依然为88。
如果改为vfork,结果为:
pid=4785,var=89
pid=4784,var=89
因为共享数据了。
如果直接粘贴上述代码,只将fork改为vfork,会出现段错误。
原因是,在fork中用return语句是允许的。
因为子进程是复制了一份数据。
然而,在vfork中用return语句,因为父子共享,则会导致栈的崩溃。
也就是父进程不能够继续执行下去了。
因此,在vfork中需要用exit()函数。