vfork详解
vfork - create a child process and block parent
原型:pid_t vfork(void);
作用:创建一个子进程,但子进程先于父进程先执行
父进程要等子进程exit()退出后才可进入父进程
返回值和fork一样
fork详解请参考
fork和vfork都是创建一个子进程,但fork之后父子进程都会将fork之后的代码拷贝一份,父子进程对同一变量的访问互不影响,而vfork是父子进程公用一份内存,当子进程对这份共用的内存中的变量进行改变时,父进程只能继续用被修改后的变量
请看两段代码进行比较
调用fork
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(){
pid_t pid;
int data = 10;
pid = fork();
if(pid == 0){
data = data + 100;
printf("child: data = %d\n",data);
// exit(0);
}else{
data = data + 10;
printf("father:data = %d\n",data);
}
return 0;
}
运行结果:
father:data = 20
child: data = 110
可以看出此时父子进程对data的值互不影响,所以时父子进程对程序数据段都会拷贝一份
调用vfork之时
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(){
pid_t pid;
int data = 10;
pid = vfork();
if(pid == 0){
data = data + 100;
printf("child: data = %d\n",data);
exit(0);
}else{
data = data + 10;
printf("father:data = %d\n",data);
}
return 0;
}
运行结果:
child: data = 110
father:data = 120
此时父进程会因子进程中对data的值改变之后继续使用改变之后的值,所以vfork父子进程是在使用同一数据段