waitpid и обработчик сигнала, C

Я попытался найти ответ на свой вопрос в этом посте: обработчик сигнала и waitpid сосуществуют, но для меня пока не очень ясно.

Я пытаюсь объяснить мои проблемы:

Я пытаюсь написать программу на C, которая касается IPC между родительским процессом и его дочерними элементами. Родительский процесс создает N дочерних процессов, затем он ожидает завершения цикла:

while((pid_term = waitpid(-1, &status, 0)) != -1)

Через X секунд родитель получает SIGALRM, затем с помощью системного вызова sigaction перехватывает сигнал тревоги:

struct sigaction act;
act.sa_handler = alarmHandler;
sigemptyset(&act.sa_mask);

act.sa_flags = 0;
sigaction(SIGALRM, &act, NULL);  

Но когда функция-обработчик возвращается, waitpid также возвращает -1, и родительский процесс выходит из цикла while, описанного выше. На данный момент функция-обработчик имеет пустое тело.

Я спрашиваю себя, что случилось - почему waitpid() вернуть -1 после вызова обработчика, хотя большинство детей все еще живы? Почему этого не происходит с signal() функционировать?

1 ответ

Поведение обработчиков сигналов по умолчанию устанавливается sigaction прервать блокировку системных вызовов; если вы проверите errno после срабатывания будильника следует соблюдать EINTR, Такое поведение почти никогда не то, что вы хотите; это только по умолчанию для обратной совместимости. Вы можете сделать это не делать это, установив SA_RESTART немного в sa_flags:

struct sigaction act;
act.sa_flags = SA_RESTART;
act.sa_handler = alarmHandler;
sigemptyset(&act.sa_mask);
sigaction(SIGALRM, &act, 0);

Одна из самых важных причин для использования sigaction вместо signalэто когда вы используете signal непредсказуемо, будет ли обработчик сигнала прерывать блокировку системных вызовов. (Линия System V выбрала одну семантику, а линия BSD - другую.)

Другие вопросы по тегам