Как родители могут дождаться завершения всех дочерних процессов, а затем завершить работу при получении SIGINT? - PullRequest
0 голосов
/ 25 сентября 2011

Я пишу многопроцессную программу на C.

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

У меня два вопроса.

  1. Как родители могут записывать каждый пид ребенка, который он обрабатывал? Дочерний процесс может завершиться до запуска функции записи основной процесс.

  2. Если родители не имеют представления о том, сколько у него дочерних процессов. Как он может ждать весь дочерний процесс закончен.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 25 сентября 2011

Вы записываете pid дочерних процессов по мере их ветвления (если требуется). вызовите waitpid в цикле с pid = 0, он либо вернет pid завершившегося процесса, либо вернет -1, и если errno = ECHILD, у вас не осталось рабов.

0 голосов
/ 12 апреля 2013

Продолжайте вызывать wait (2) в цикле.Каждый раз, когда возвращается функция wait (), вы получаете PID вышедшего дочернего элемента и его статус .Статус сообщит вам, вышел ли он нормально (с кодом выхода) или из-за сигнала.Как то так (не тестировалось):

#include <sys/types.h>
#include <sys/wait.h>
...
pid_t    pid;
int      status;
...
while ((pid = wait(&status)) > 0) {
        printf("Child %lu ", (unsigned long)pid);
        if (WIFEXITED(status))
                printf("exited with status %d\n", WEXITSTATUS(status));
        else if (WIFSIGNALED(status))
                printf("killed by signal %d\n", WTERMSIG(status));
        else if (WIFSTOPPED(status))
                printf("stopped by signal %d\n", WSTOPSIG(status));
        else if (WIFCONTINUED(status))
                printf("resumed\n");
        else
                warnx("wait(2) returned for no discernible reason");
}
...