Что это за шаблон на основе форка? - PullRequest
0 голосов
/ 28 декабря 2018

при поиске страницы 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), но особенно в комментарии «внука» в коде.

.. действительно ссылался на это Что делает wait () в Unix? , но не полезно.

спасибо, ~ viren

1 Ответ

0 голосов
/ 29 декабря 2018

Похоже, код, созданный ранее для запуска процесса таким образом, что его жизнь полностью отделена от этого запущенного кода.Таким образом, дочерний элемент дочернего процесса запускается для выполнения интересного кода, но промежуточный процесс (прямой дочерний элемент) необходимо удалить из списка процессов, поэтому ожидающий код для удаления зомби.Полный шаблон, вероятно, таков:

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)
...