Как мне интерпретировать "функция waitpid не ждет дочернего элемента, который завершается первым;" - PullRequest
1 голос
/ 29 марта 2020

В книге «Расширенное программирование в Unix среде», раздел wait и waitpid говорит:

функция waitpid не ожидает дочернего элемента, который завершается первым; у него есть несколько опций, которые определяют, какой процесс он ожидает.

Я читал это так, как если бы дочерний процесс завершился первым, а родительский процесс не вызвал функцию waitpid, дочерний процесс процесс не будет ждать и останется как процесс zomb ie после выхода.

Итак, я написал код для проверки:

int main() {
    pid_t pid = fork();
    if (pid == 0) {
        // child process
        printf("Child Process ID: %d \n", getpid());
        printf("Child Process Quit\n");
        exit(0);
    } else {
        // parent 
        sleep(5);
        printf("Parent Process ID: %d \n", getpid());
        printf("Wait child %d ...\n", pid);
        int status;
        waitpid(pid, &status, 0);
        printf("waitpid called\n");
        sleep(5);
    }
    return 0;
}

Программа сначала распечатала «Дочерний процесс». ID "и" дочерний процесс завершен ", пока родительский процесс все еще спит, в другом окне терминала, если я использую ps -el | grep 'Z', я вижу, что этот дочерний процесс <defunct> (zomb ie).

Затем через 5 секунд, пока родительский процесс с именем waitpid в другом терминальном окне, использование ps -el | grep 'Z' больше не будет показывать дочерний процесс zomb ie, то есть дочерний процесс ожидание процесса, а не зомба ie.

Так что кажется, что родительский процесс всегда может ожидать дочерний процесс с waitpid, поэтому как интерпретировать эту функцию "waitpid не ждет для ребенка, который заканчивается первым "?

1 Ответ

0 голосов
/ 29 марта 2020

Если вы завершите цитату (как теперь завершено в вопросе), вы увидите, что waitpid() более гибок (чем wait()).

Спецификация POSIX говорит:

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

  • Если pid равен (pid_t)-1, состояние запрашивается для любого дочерний процесс. В этом отношении waitpid() тогда эквивалентно wait().

  • Если pid больше 0, это указывает идентификатор процесса одного дочернего процесса для которого запрашивается состояние.

  • Если pid равно 0, состояние запрашивается для любого дочернего процесса, чей идентификатор группы процессов равен идентификатору вызывающего процесса.

  • Если pid меньше (pid_t)-1, запрашивается состояние для любого дочернего процесса, чей идентификатор группы процессов равен абсолютному значению pid .

Таким образом, как говорится в цитате, waitpid() не всегда (только) ждет, когда первый ребенок умрет; вы можете гораздо точнее выбрать интересующего вас ребенка или детей. Кроме того, у вас есть такие параметры, как WNOHANG, которые означают, что функция возвращает значение, если нет умершего ребенка, который соответствует критерию (но есть по крайней мере один процесс, который будет соответствовать критерию). Вы получаете другой статус, если нет детей, которые соответствуют критериям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...