【发布时间】:2019-05-26 07:32:36
【问题描述】:
在搜索 accept4(2) 页面时,我遇到了下面有趣的代码。谁能帮我理解这个分叉模式吗? (:
/* Make the process the grandchild so we don't have to worry about waiting for it later. */
if (pid != 0) {
#ifdef HAVE_WAITPID
while (waitpid(pid, (int *) 0, 0) < 0 && errno == EINTR)
;
#else
PIDTYPE wpid;
while ((wpid = wait((int *) 0)) != pid && (wpid >= 0 || errno == EINTR))
;
#endif
。不是在寻找 wait(2) 与 waitpid(2) 的区别,而是在代码中特别是“孙子”注释。
.. 确实提到了这个What does wait() do on Unix? 但没有用。
谢谢, ~薇伦
【问题讨论】:
-
没有足够的上下文(代码)可以肯定地说出任何事情。
-
如果父母不想再关心孩子,则使用“孙子”模式(双叉())。主进程分叉子进程。孩子分叉孙子并退出。家长在等孩子。孙子现在(通常)是 init 进程 (1) 的子进程,它将在退出时自动获取它。
-
通常更有可能是父母,而不是祖父母,称他们的孩子为恶魔,但总体思路是正确的。
-
Double fork() 通常用于使生成的进程归 init 所有。请参阅手册页守护程序 (7)。
-
Ctx 你能把你的评论作为答案吗?我会接受它,因为这正是我想要的。