10.8.3. Родительский надзор: три различные стратегии
10.8.3. Родительский надзор: три различные стратегии
Как описано в разделе 9.1.1 «Создание процесса: fork()», одним побочным эффектом вызова fork() является создание между процессами отношений родитель-потомок. Родительский процесс может ждать завершения одного или более из своих потомков и получить статус завершения порожденного процесса посредством одного из семейства системных вызовов wait().
Завершившиеся порожденные процессы, которых никто не ожидал, называются зомби (zombies). Обычно каждый раз при завершении порожденного процесса ядро посылает родительскому процессу сигнал SIGCHLD[112]. Действием по умолчанию является игнорирование этого сигнала. В этом случае процессы зомби накапливаются до тех пор, пока родитель не вызовет wait() или не закончится сам. В последнем случае процессы зомби получают в качестве нового родителя системный процесс init (PID 1), который получает от них результаты как часть своей обычной работы. Сходным образом, активные потомки также получают родителем init, и их результаты будут собраны при их завершении.
SIGCHLD используется для большего, чем уведомление о завершении потомка. Каждый раз при остановке потомка (посредством одного из обсужденных ранее сигналов управления заданиями) родителю также посылается SIGCHLD. Стандарт POSIX указывает, что SIGCHLD «может быть послан» также, когда помок вновь запускается; очевидно, среди оригинальных Unix-систем имеются различия.
Сочетание флагов для поля sa_flags в struct sigation и использование SIG_IGN в качестве действия для SIGCHLD позволяет изменить способ обработки ядром остановок, возобновления или завершения потомков.
Как и с сигналами в общем, описанные здесь интерфейсы и механизмы сложны, поскольку они развивались с течением времени.