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,调用栈就给破坏了,等子进程退出,父进程在运行时,就会出错误了。