linux应用程序开发入门——进程创建中fork和vfork的区别

  • xidianzxc
  • LV3工程师
  • |      2015-03-16 22:59:21
  • 浏览量 1062
  • 回复:8

Linux中另外一个创建进程的方法是vfork,今天我们主要来说说fork和vfork的区别vfork的函数原型如下:

pid_t vfork(void);

返回值:和fork相同,在父进程中返回子进程的进程号,在子进程中返回0,若出错则返回-1

那么fork和vfork的区别是什么呢?我们知道fork要拷贝父进程的数据段,而vfork则不需要完全拷贝父进程的数据段,子进程与

父进程共享数据段除此之外,fork不对父子进程执行顺序进行任何限制;而在调用vfork中,子进程先运行,父进程挂

,直到子进程调用了E X E C或者E X I T之后,父子进程的执行次序才不再有限制。

 我们来看个简单的程序:

       linux应用程序开发入门——进程创建中fork和vfork的区别

       linux应用程序开发入门——进程创建中fork和vfork的区别

在上面这个程序中,我们可以看到,调用vfork创建子进程后,我们在子进程中对count变量进行加1操作,然后在父进程和子进程中分别打印count的值。

我们来编译运行这个程序:

       linux应用程序开发入门——进程创建中fork和vfork的区别

从运行结果,我们可以看到,先运行的是子进程,在子进程中count值加1,所以打印出来是2,调用exit()函数后,父进程得到运行,打印出来的count值也是2,这是因为子进程和父进程是共享数据段的,也就是改变的count变量是同一个。

为了鲜明的对比forkvfork,我们利用fork来写一个和上面类似的程序

       linux应用程序开发入门——进程创建中fork和vfork的区别

       linux应用程序开发入门——进程创建中fork和vfork的区别

上图的程序我们使用fork程序来创建子进程,在父进程中对count1操作,在子进程中,不对count进行操作。

我们来编译运行一下:

       linux应用程序开发入门——进程创建中fork和vfork的区别

从上图,我们可以看到fork中,因为父子进程的运行顺序是随机的,这次是父进程先运行,因为父进程中count值加1,所以在父进程中打印了2,但是因为我们知道fork创建的子进程不是共享数据段,而是复制了父进程的数据段,也就是说是独立的。所以我们可以看见,在后运行的子进程中打印的数据依然是1

好了,从以上两个例子,我们已经清楚的看见了forkvfork的区别了~


这个系类的笔记汇总贴在:linux应用程序开发入门笔记系列,欢迎大家交流指正~

  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:8
-12大风 2015-03-23
谢谢分享!
0   回复
举报
发布
xidianzxc 2015-03-17
感谢老大一如既往的支持~
0   回复
举报
发布
冰山一角 2015-03-17
  不敢 觉得这个名字蛮有喜感的
0   回复
举报
发布
灵澈 2015-03-17
很不错,支持一下
0   回复
举报
发布
xidianzxc 2015-03-17
卧槽,冰哥莫要笑人家~
0   回复
举报
发布
冰山一角 2015-03-17
葫芦娃  
0   回复
举报
发布
xidianzxc 2015-03-16
大家可以一起交流啊~我也刚学~
0   回复
举报
发布
武力戡乱 2015-03-16
葫芦娃兄!这不是在学Linux吗!能带我一个吗?
0   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子