这种基于fork的模式是什么?

时间:2018-12-28 13:09:57

标签: c unix fork posix waitpid

在搜索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?,但没有用。

谢谢, 〜viren

1 个答案:

答案 0 :(得分:1)

看起来像之前的代码可以以完全脱离正在运行的代码的方式启动进程的过程。因此,运行一个孩子的孩子来执行有趣的代码,但是需要从流程列表中删除中间流程(直接孩子),因此需要等待代码来删除僵尸。 完整的模式可能是这样的:

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)