当前位置:  技术问答>linux和unix

vfork函数

    来源: 互联网  发布时间:2017-03-03

    本文导语:  程序里有两个exit(0),如果屏蔽掉,结果子进程多运行一遍,这是什么原因呢? #include  #include  #include  #include  #include  #include  #include  int main(void) { pid_t child; /* 创建子进程 */ if((child=vfork())==-1) { printf("Fork Er...

程序里有两个exit(0),如果屏蔽掉,结果子进程多运行一遍,这是什么原因呢?
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(void)
{
pid_t child;

/* 创建子进程 */
if((child=vfork())==-1)
{
printf("Fork Error : %sn", strerror(errno));
exit(1);
}
else 
if(child==0) // 子进程
{
sleep(1); //子进程睡眠一秒
printf("I am the child: %dn", getpid());
//exit(0);
}
else        //父进程
{
printf("I am the father:%dn",getpid());
//exit(0);
}
}

|

   Linux Description
       vfork(), just like fork(2), creates a child process of the calling process.  For details and return value and errors, see fork(2).

       vfork()  is  a special case of clone(2).  It is used to create new processes without copying the page tables of the parent process.  It may be useful in
       performance-sensitive applications where a child is created which then immediately issues an execve(2).

       vfork() differs from fork(2) in that the parent is suspended until the child terminates (either normally, by  calling  _exit(2),  or  abnormally,  after
       delivery  of a fatal signal), or it makes a call to execve(2).  Until that point, the child shares all memory with its parent, including the stack.  The
       child must not return from the current function or call exit(3), but may call _exit(2).


你已经错的不能再错了, 看看vfork是拿来干什么的吧。

exit和_exit的区别是什么搞清楚了吗?为什么这里只能用_exit而不是exit?理解了吗?

|
子进程多运行一遍?你是想说printf的输出多了一行吧?

vfork的子进程在exit或者exec之前是运行在父进程地址空间中
如果vfork的子进程调用exit会影响父进程的行为,因为exit会刷新并关闭I/O输出流(c库的实现不同可能有不同),所以vfork的子进程调exit后,父进程的I/O流也被关闭了,所以父进程的printf无法输出

注释掉了exit,自然父子进程的printf都能输出了

|
vfork在不同的unix/linux版本上的实现有微妙的语议差别,
至少你这个例子在我的ubuntu上会异常退出

I am the child: 18293, father is 18292
I am the father:18292
test: cxa_atexit.c:100: __new_exitfn: Assertion `l != ((void *)0)' failed.
Aborted

你可以把子进程的父进程的pid也打出来看看倒底第二个子进程的父进程是哪个.

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 我想和vfork出来的子进程通信(见者加分)
  • <unix环境变量高级编程第8章> vfork例题的疑问
  • 我想让vfork后就execl一进程,同时让execl出来的进程之间能相互通信,求助
  • 请问下面一个关于vfork的c程序的运行结果为什么会出现Segmentation fault ?哪位高手帮我解释下,谢谢。
  • 使用vfork(),后用return 出现段错误问题
  • 一个简单的vfork pid 问题?
  • what's the difference between fork()&vfork()?
  • 关于vfork()问题,为什么其对父进程共享的变量的操作结果不是预期的?请高手指点,多谢了
  • vfork深度解析!!!
  • vfork中多进程间共享描述符的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3