Как система узнает, что больше нет ожидаемых детей? - PullRequest
0 голосов
/ 19 июля 2011

На основании этого: http://man7.org/tlpi/code/online/book/procexec/multi_wait.c.html

int
main(int argc, char *argv[])
{
    int numDead;       /* Number of children so far waited for */
    pid_t childPid;    /* PID of waited for child */
    int j;

    if (argc < 2 || strcmp(argv[1], "--help") == 0)
        usageErr("%s sleep-time...\n", argv[0]);

    setbuf(stdout, NULL);           /* Disable buffering of stdout */

    for (j = 1; j < argc; j++) {    /* Create one child for each argument */
        switch (fork()) {
        case -1:
            errExit("fork");

        case 0:                     /* Child sleeps for a while then exits */
            printf("[%s] child %d started with PID %ld, sleeping %s "
                    "seconds\n", currTime("%T"), j, (long) getpid(),
                    argv[j]);
            sleep(getInt(argv[j], GN_NONNEG, "sleep-time"));
            _exit(EXIT_SUCCESS);

        default:                    /* Parent just continues around loop */
            break;
        }
    }

    numDead = 0;
    for (;;) {                      /* Parent waits for each child to exit */
        childPid = wait(NULL);
        if (childPid == -1) {
            if (errno == ECHILD) {
                printf("No more children - bye!\n");
                exit(EXIT_SUCCESS);
            } else {                /* Some other (unexpected) error */
                errExit("wait");
            }
        }

        numDead++;
        printf("[%s] wait() returned child PID %ld (numDead=%d)\n",
                currTime("%T"), (long) childPid, numDead);
    }
}

При ошибке, wait возвращает -1. Одна из возможных ошибок заключается в том, что вызывающий процесс не имеет (ранее не ожидавшихся) детей, о чем свидетельствует значение ошибки ECHILD .

$ ./multi_wait 7 1 4
[13:41:00] child 1 started with PID 21835, sleeping 7 seconds
[13:41:00] child 2 started with PID 21836, sleeping 1 seconds
[13:41:00] child 3 started with PID 21837, sleeping 4 seconds
[13:41:01] wait() returned child PID 21836 (numDead=1)
[13:41:04] wait() returned child PID 21837 (numDead=2)
[13:41:07] wait() returned child PID 21835 (numDead=3)
No more children - bye!

Вопрос

Как система узнает, что больше нет ожидающих детей, и возвращает ECHILD. Например, в этом примере, что если некоторые дети спят очень долго?

Ответы [ 2 ]

2 голосов
/ 19 июля 2011

Система отслеживает каждый процесс. Вы можете использовать команду ps xf для просмотра дерева процессов в вашей системе Ubuntu.

В частности, в этом списке вы можете видеть состояние каждого процесса: R = запущен, S = спит, T = остановлен, Z = зомби (завершен, ожидает, когда родительский процесс соберет статус выхода с помощью системного вызова wait()) .

Используя эту информацию, система знает, когда вернуть ECHILD (больше не осталось детей).

1 голос
/ 19 июля 2011

Ядро поддерживает структуру данных для каждого запущенного процесса.Он также поддерживает структуры данных для мертвых, но не ожидаемых процессов (зомби).Структура данных родительского процесса содержит информацию о дочерних элементах, которых он еще не ждал (независимо от того, являются ли они зомби или все еще живы, главное отличие зомби в том, что они почти не имеют плоти, то есть их структуры данных содержат только статус выходаиспользование ресурсов и не намного больше, поэтому они очень лёгкие).

...