假设我有进程foo和可执行文件。 foo调用fork(),现在我有两个,称之为foo_parent和foo_child。
我不太明白foo_child / bar会发生什么。 foo_child是否用内存覆盖在内存中?是否开始了一个新的条形过程并给出了foo_child的pid? bar是foo_child的子项,foo_child只是将返回值传递给foo_parent吗?
我知道当foo_parent在等待后获得退出状态时,它就是bar的exit()调用的结果,但是我不能很好地理解这些内容是什么' s发生在"引擎盖下,"原样。
答案 0 :(得分:2)
foo_child
的过程完全由bar
取代。它具有相同的PID,并且foo_child
和bar
中的许多其他属性相同,但可执行文件重新启动。流程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。