关键区别一: vfork 直接使用父进程存储空间,不拷贝。
关键区别二: vfork保证子进程先运行,当子进程调用exit退出后,父进程才执行。
我们可以定义一个cnt,在子进程中让它变成3, 如果使用fork,那么在父进程中打印cnt的值时,cnt依然为0,因为子进程和父进程用的是不同的内存空间。
而如果使用vfork, 那么在父进程中打印cnt的值时,cnt的值为3,因为使用的是和父进程相同的内存空间。
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t pid;
int cnt = 0;
pid = vfork(); //使用vfork
if(pid > 0){
while(1){
printf("cnt = %d\n", cnt);
printf("this is father print, pid = %d,\
child pid = %d\n", getpid(), pid);
sleep(2);
}
}
else if(pid == 0){
while(1){
printf("this is child print, pid = %d\n", getpid());
sleep(1);
cnt++;
if(cnt == 3){
exit(0);
}
}
}
return 0;
}
使用vfork的结果:
使用fork的结果:可以看见,程序没有没有等待子进程结束再执行父进程,而是互相争夺CPU的资源。