1 #include <stdio.h>
2 #include <unistd.h>
3 #include <sys/types.h>
4 #include <error.h>
5
6 int main()
7 {
8 pid_t id=vfork();
9 if(id==29){//child
10 printf("child:hello world\n");
11 //exit(0);
12 return 0;
13 }else if(id<0){
14 perror("vfork");
15 exit(1);
16 }else{//father
17 printf("father:hello bit\n");
18 }
19 return 0;
20 }
exit运行结果为:
child:hello world
father:hello bit
return运行结果为:
child:hello world
father:hello bit
child:hello world
father:hello bit
child:hello world
father:hello bit
child:hello world
father:hello bit
child:hello world
father:hello bit
child:hello world
father:hello bit
child:hello world
father:hello bit
child:hello world
father:hello bit
child:hello world
father:hello bit
child:hello world
father:hello bit
child:hello world
father:hello bit
vfork: Resource temporarily unavailable
运行结果分析:
vfork 时父子进程共享数据段,fork时进行拷贝,如果,vfork子进程中使用return返回,则会出现段错误 。
vfork后父子进程是共用一个栈的。内核会让父进程暂时挂起,等子进程退出后在执行(或者释放其所使用的地址空间,比如调用exec函数)。子进程从vfork中return,调用栈就给破坏了,等子进程退出,父进程在运行时,就会出错误了。