SIGCHLD
В POSIX-системах SIGCHLD — сигнал, посылаемый при изменении статуса дочернего процесса (завершён, приостановлен или возобновлен).
SIGCHLD | |
---|---|
Описание | Состояние дочернего процесса изменилось |
По умолчанию | игнорируется |
Коды SA_SIGINFO | |
CLD_EXITED | нормальное завершение |
CLD_KILLED | аварийное завершение (без дампа памяти) |
CLD_DUMPED | аварийное завершение с дампом памяти |
CLD_TRAPPED | завершен отладочной ловушкой |
CLD_STOPPED | остановлен |
CLD_CONTINUED | выполнение продолжено после остановки |
SIGCHLD — целочисленная константа, определенная в заголовочном файле signal.h
. Символьные имена сигналов используются вместо номеров, так как в разных реализациях номера сигналов могут различаться.
Этимология
SIG — общий префикс сигналов, CHLD — сокращенное написание англ. child — ребенок, дочерний объект (английский компьютерный жаргон).
Использование
В Unix процесс может порождать «дочерние» процессы системным вызовом fork()
или его вариантами. Родительский процесс, если он существует, уведомляется системой о завершении дочерних процессов (или изменении их состояния) сигналом SIGCHLD. Родительский процесс не должен предпринимать для этого никаких действий. Сигнал может быть игнорирован, если не нуждается в обработке (по умолчанию он игнорируется).
Процессы-зомби
Дочерний процесс по завершении становится «зомби» — пустой записью в таблице процессов, хранящей информацию о завершенном процессе (точнее — код завершения) — до тех пор, пока родительский процесс не получит эту информацию с помощью системного вызова wait()
или не завершится сам.
В короткоживущих программах наличие «зомби» — вполне нормальное явление — зомби не занимают много ресурсов и исчезают с завершением родительского процесса. Но аккуратные программисты всегда заботятся об обработке «зомби». В общем случае для предотвращения накопления «зомби» программа должна использовать обработчик сигнала SIGCHLD c вызовом wait()
, однако это совсем не обязательно, если вызывающая программа не делает в обработчике SIGCHLD ничего, кроме wait, то можно просто установить этот обработчик в SIG_IGN и процессы зомби будут собираться[1] автоматически. Тут следует заметить, что установка SIGCHLD в SIG_IGN совместима с POSIX.1-2001 и не совместима с POSIX.1-1990.
В Perl'е установка
$SIG{'CHLD'}="IGNORE"
на самом деле устанавливает обработчик с обработкой процессов-зомби, как описано выше.
Python при
signal.signal(signal.SIGCHLD, signal.SIG_IGN)
делает то же самое.
Примечания
- microHOWTO: Reap zombie processes using a SIGCHLD handler . www.microhowto.info. Дата обращения: 4 мая 2016.