C/signal.h/SIGCHLD — различия между версиями

Материал из C\C++ эксперт
Перейти к: навигация, поиск
(Новая страница: «В POSIX-системах SIGCHLD — сигнал, посылаемый при изменении статуса дочернего процесса (заверше…»)
 
(нет различий)

Текущая версия на 22:14, 21 июня 2010

В POSIX-системах SIGCHLD — сигнал, посылаемый при изменении статуса дочернего процесса (завершен, приостановлен или возобновлен).

SIGCHLD — целочисленная константа, определенная в заголовочном файле signal.h. Символьные имена сигналов используются вместо номеров, так как в разных реализациях номера сигналов могут различаться.

SIG — общий префикс сигналов, CHLD — сокращенное написание англ. child — ребенок, дочерний объект (английский компьютерный жаргон).

Использование

В Unix процесс может порождать «дочерние» процессы системным вызовом fork() или его вариантами. Родительский процесс, если он существует, уведомляется системой о завершении дочерних процессов (или изменении их состояния) сигналом SIGCHLD. Родительский процесс не должен предпринимать для этого никаких действий. Сигнал может быть игнорирован, если не нуждается в обработке (по умолчанию он игнорируется).

Процессы-зомби

Основная статья: Процесс-зомби Дочерний процесс по завершении становится «зомби» — пустой записью в таблице процессов, хранящей информацию о завершенном процессе (точнее — код завершения) - до тех пор, пока родительский процесс не получит эту информацию с помощью системного вызова wait() или не завершится сам.

В короткоживущих программах наличие «зомби» вполне нормальное явление — зомби не занимают много ресурсов и исчезают с завершением родительского процесса. Но аккуратные программисты всегда заботятся о обработке «зомби». В общем случае для предотвращения накопления «зомби» программа должна использовать обработчик сигнала SIGCHLD c вызовом wait().

В Perl-е установка <source lang="perl">$SIG{'CHLD'}="IGNORE"</source>

на самом деле устанавливает обработчик с обработкой процессов-зомби, как описано выше.

Python при <source lang="python">signal.signal(signal.SIGCHLD, signal.SIG_IGN)</source>

делает то же самое.