Почему мы вообще игнорируем SIGCHLD
Я изучал сигналы и проходил по этой ссылке
https://en.wikipedia.org/wiki/Child_process
И это то, что он говорит: "Сигнал SIGCHLD отправляется родителю дочернего процесса, когда он завершается, прерывается или возобновляет работу после прерывания. По умолчанию сигнал просто игнорируется"
есть ли причина, по которой мы игнорируем SIGCHLD.
2 ответа
Попробуйте завести детей, и вы поймете, почему иногда нужно игнорировать SIGCHLD
чтобы сохранить ваше здравомыслие:).
Помимо шуток, все это утверждение означает, что системы POSIX не определяют поведение сигнала по умолчанию, кроме как игнорировать его, для SIGCHLD. Сравните это с SIGINT
, SIGTERM
и т. д., где поведение по умолчанию может заключаться в прекращении процесса.
Увидеть man 7 signal
в Linux для получения списка всех сигналов, всех обработчиков по умолчанию и отображения сигналов-> обработчик по умолчанию.
Часто имеет смысл игнорировать SIGCHLD, потому что вы можете знать все, что вам нужно знать из waitpid
,
Несмотря на то, что мой ответ запоздал, он может быть полезен для более удивительного человека, который думает о необходимости SIGCHLD
и почему это игнорируется. Давайте послушаем мою историю.
Я взял проект, в котором мы транслируем онлайн радиостанции, чьи расширения .pls
, .m3u
или просто IP:Port
, Каждая станция - это канал для нас. Существуют два doodads - потенциометр и вращающийся датчик - которые могут вращаться (переключаться) по часовой стрелке или против часовой стрелки. Первый используется для регулировки громкости радио, а второй - для переключения каналов. Я использую медиаплеер, работающий через терминал, так что это тоже другой процесс. Кроме того, я использую amixer, который также является еще одним дополнительным процессом для резкой регулировки громкости в течение бесконечного цикла. В основном процессе я создаю два процесса. Для смены канала я предпочитаю посылать сигнал SIGKILL для завершения процесса проигрывания, который может воспроизводить выбранную станцию для перехода на новый канал и wait()
в родительском. wait()
использование здесь уместно, потому что я убил его, прежде чем ждать. Он бы сразу вернулся без блокировки. Со стороны переключателя громкости работает до выключения радиоустройства. Его процесс выполняется в бесконечном цикле.
Итак, что произойдет, если я решу подождать, пока родительский процесс не отрегулирует громкость?
Основной процесс будет заблокирован навсегда, так как процесс регулировки громкости никогда не вернется. Вместо этого я предпочитаю обращаться явно, но игнорируя. Зачем? Потому что мне все равно, когда он заканчивается или каково его возвращаемое значение. Меня волнует только то, что после его окончания я не хочу, чтобы ребенок превратился в зомби. Я просто хочу, чтобы, когда ребенок выходит, он сразу же пожинал, а не блокировал основной процесс.
Почему мы вообще игнорируем
SIGCHLD
?
Если (как в вышеупомянутом примере) обработчик сигнала не делает ничего, кроме вызова waitpid
тогда альтернатива доступна. Настройка SIGCHLD
обработчик SIG_IGN
приведет к автоматическому запуску процессов зомби.
Не забывайте, что для этого нужно явно sigaction()
с расположением SIG_IGN
нужно.