MemoryGarden's Blog

努力 -----------大能猫

C++博客 首页 新随笔 联系 聚合 管理
  118 Posts :: 11 Stories :: 20 Comments :: 0 Trackbacks
vfork 同 fork 的返回值是一样的,不同的地方是vfork通常创建子进程的目的是 exec一个新的程序,vfork不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用 exec 或者是 exit 于是就不会存在访问该空间。如果子进程在调用 exec 或者 exit 的时候,它是在父进程的空间中运行的。vfork 保证子进程先运行,它在exec 或 exit 之后,父进程才会被执行(如果子进程中依赖父进程的进一步操作,那么,悲剧了,死锁)


下面代码当子进程在 _exit 之前改变了变量 value 的值,父进程也改变了,这是因为vfork 出来的子进程是在父进程的地址空间运行的。   父进程没有 sleep 是因为 vfork 确保了子进程执行结束后,父进程才开始。


 1 
 2 #include <unistd.h>
 3 #include <stdio.h>
 4 #include <sys/types.h>
 5 
 6 
 7 int main(){
 8   int value = 0;
 9   int pid = vfork();
10   if(pid < 0){
11     puts("ERROR");
12   }else if(pid == 0){ //child
13     ++value;
14     printf("child father id:%d, value:%d\n", getppid(), value);
15     _exit(0); // child process is end; father process begin.
16   }else//parent
17     printf("father child id:%d, value:%d\n", pid, value);
18   }
19   return 0;
20 }
21 

运行结果:

child father id:3072, value:1
father child id:
3073, value:1



posted on 2011-06-05 16:50 memorygarden 阅读(224) 评论(0)  编辑 收藏 引用 所属分类: 网络编程

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理