首页 > 代码库 > (疑问)进程控制(五)---vfork 函数
(疑问)进程控制(五)---vfork 函数
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 函数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。