当我从c中的分叉子进行exec()时会发生什么

时间:2015-02-14 04:42:41

标签: c exec fork

假设我有进程foo和可执行文件。 foo调用fork(),现在我有两个,称之为foo_parent和foo_child。

  • foo_parent调用wait()
  • foo_child调用execvp([stuff to run bar]);

我不太明白foo_child / bar会发生什么。 foo_child是否用内存覆盖在内存中?是否开始了一个新的条形过程并给出了foo_child的pid? bar是foo_child的子项,foo_child只是将返回值传递给foo_parent吗?

我知道当foo_parent在等待后获得退出状态时,它就是bar的exit()调用的结果,但是我不能很好地理解这些内容是什么' s发生在"引擎盖下,"原样。

2 个答案:

答案 0 :(得分:2)

foo_child的过程完全由bar取代。它具有相同的PID,并且foo_childbar中的许多其他属性相同,但可执行文件重新启动。流程bar仍然是foo_parent的孩子,因此foo_parent可以获得退出状态等。

请注意,exec*()函数系列如果成功则永远不会返回。如果他们回来了,他们就失败了。

答案 1 :(得分:2)

“foo调用fork(),现在我有两个,称之为foo_parent和foo_child。”

不那么令人困惑:你仍然拥有进程foo(父进程),现在你也有了一个子进程(foo_child)。

“foo是否在内存中被覆盖?”

当foo_child调用exec()时,其内存空间将被bar覆盖。它保留了foo的一些东西。特别是,在foo中打开的文件描述符(并且不是close-on-exec)仍然在bar中打开,它还继承了foo的一些信号处理配置(详情请参阅exec *的手册页)。 / p>

“是否启动了一个新的bar进程并给出了foo_child的pid?”

Sorta,不太好。分叉时,新进程foo_child有自己的pid和内存空间。它在fork时有一个foo的内存空间。当它调用exec(bar)时,它的内存空间被bar覆盖并运行bar的可执行代码而不是foo。

“bar是否为foo_child的子项,而foo_child只是将返回值传递给foo_parent?”

不,bar(即-foo_child现在正在执行bar)是foo的子进程,其退出值可以返回给foo。

相关问题