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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(疑问)进程控制---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 函数的主要内容,如果未能解决你的问题,请参考以下文章

进程控制fork与vfork

APUE学习之进程控制 - fork 与 vfork

APUE第八章-进程控制

linux 进程创建clonefork与vfork

如何知道 vfork 函数中的父进程或子进程

Linux学习之“vfork函数”