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 - другую.)