ждать детей и внуков - PullRequest
       10

ждать детей и внуков

3 голосов
/ 06 декабря 2011

Как вы можете дождаться выхода всех детей и внуков, не блокируя обработчик сигнала? Это моя попытка.

#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int run = 1;

void handler(int sig, siginfo_t *info, void *uap)
{
    int exit_code;

    printf("sigchld pid %d\n", info->si_pid);
    pid_t pid = waitpid(-1, &exit_code, 0);
    if (pid == -1) {
        perror("waitpid()\n");
    } else {
        printf("waitpid returned %d\n", pid);
    }
    // set run = 0 when all children exit

    printf("end of sigchild handler\n");
}

void main() {

    struct sigaction chld;
    chld.sa_sigaction = handler;
    chld.sa_flags = SA_NOCLDSTOP | SA_SIGINFO;
    sigaction(SIGCHLD, &chld, NULL);

    //procmask sigchld?
    if (!fork ()) {
        if (!fork ()) {
            sleep(2);
            printf ("grand-son exit: %d\n", getpid());
            exit (0);
        }
        sleep(1);
        printf ("son exit: %d\n", getpid());
        exit (0);
    }

    while(run)
        sleep(1);

    printf("ciao\n");
}

1 Ответ

1 голос
/ 25 ноября 2014

Хотя верно, что SIGCHLD, waitpid и т. Д. Работают только для непосредственных детей, в системах UNIX часто можно немного «обмануть» унаследованные ресурсы, переданные от родителя к потомку внуку и закрытые при обработке.завершение.

Например, исходный процесс может открыть pipe и, возможно, установить чтение конец его close-on-exec , так что дети и внуки наследуют конец записи.Когда исходный процесс готов ждать завершения всех потомков, он закрывает конец записи канала и блокирует read с или select с для читаемости оставшегося дескриптора.Когда последний потомок завершит свою работу, конец канала чтения прочитает EOF.

Эта тактика не гарантируется - ребенок или внук могут осторожно закрыть унаследованные файловые дескрипторы - но часто это работает достаточно хорошо.

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