【问题标题】:What's this fork-based pattern?这种基于分叉的模式是什么?
【发布时间】: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 你能把你的评论作为答案吗?我会接受它,因为这正是我想要的。

标签: c unix fork posix waitpid


【解决方案1】:

看起来之前的代码是用来启动一个进程的,它的生命与正在运行的代码完全分离。所以运行一个child的子进程来执行感兴趣的代码,但是中间进程(直接子进程)需要从进程列表中移除,所以等待代码移除僵尸。 完整的模式可能是这样的:

if (fork()==0) { // child
    if (fork()==0) { /// gran child
        // interesting things happens here in "detached" mode
        exec(..;);
        exit(...);
    }
    // direct child is of no use,
    // just to build the detached granchild,
    // disappear immediatly
    exit(...);
}
wait(...); // need to remove the child zombie (wait or waitpid)

【讨论】:

    猜你喜欢
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 2016-11-16
    • 1970-01-01
    • 2016-09-13
    相关资源
    最近更新 更多