码迷,mamicode.com
首页 > 系统相关 > 详细

(疑问)进程控制(五)---vfork 函数

时间:2016-10-01 16:52:19      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:

vfork 函数和 fork 函数类似,也可以用来创建子进程,但是和 fork 创建的子进程有以下几点不同:
  • fork 创建的子进程和父进程之间的执行顺序是不确定的,取决的调度算法的实现。而 vfork 函数创建的子进程 一定是先于父进程执行的,父进程会阻塞到当子进程中调用了 exec 或者 exit函数后,才会被唤醒开始执行。
  • fork 创建的子进程和父进程是各自独立的地址空间,而 vfork 创建出的子进程在子进程调用 exec 或者 exit函数之前都是和父进程共享地址空间的。
  vfork 函数的优点就是在于在使用 exec 函数之前,子进程和父进程完全共享地址空间,效率高,但是由于现在 fork 函数采用了 “写时复制”技术,效率上不输 vfork 函数。所以现在基本上都不在使用 vfork 函数。
  当子进程终止的时候,内存空间不会被释放,父进程会从vfork函数后开始执行。
=====================================================
特别要注意的是:
  在vfork创建的子进程中是不能够使用return来作为子进程的结束的,必须使用exit()函数或者_exit()函数来使子进程退出。(在fork创建的子进程中是没有问题的)
疑问:
  具体的原因未知,以后深入分析的时候再解决。大概就是使用return语句会破坏栈空间,而exit不会破坏栈。
=====================================================
  对于在vfork创建的子进程中使用 exit 函数终止和使用 _exit 函数终止还是有区别的,区别主要来自于 exit 函数和 _exit 函数本身的不同。
  之前对exit函数有个错误的认识:之前认为 exit() 函数会关闭文件流,其实exit() 函数不会关闭文件流对象(就是释放FILE结构体,释放缓冲区),但是会刷新文件流的缓冲区。文件流的关闭如果没有使用fclose的话,内核会在进程终止后强制关闭该文件流对象(vfork创建出的子进程在终止时内核不会强制关闭文件流对象的)。
  _exit() 函数是不会刷新缓冲区的,缓冲区中的内容将会被丢弃,直接进入内核结束进程。

(疑问)进程控制(五)---vfork 函数

标签:

原文地址:http://www.cnblogs.com/frank-yxs/p/5925886.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!