Почему мы вообще игнорируем 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 нужно.

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