2012-03-23 24 views
3

В Unix, когда дочерний процесс в фоновом режиме завершается, он отправляет сигналу SIGCHLD родительскому лицу, чтобы сообщить ему, что он завершен.Обработка сигналов SIGCHLD

Случается ли такое же, даже если процесс был на переднем плане? Если это так, это означает, что родитель будет просто игнорировать его.

Это право? Или, если он находится на переднем плане, тогда никакой сигнал не посылается вообще?

+1

Да, SIGCHLD также отправляется для процессов переднего плана, я считаю. Вы можете проверить с помощью strace. –

+0

Вы попробовали? –

ответ

9

background and the frontround - концепции управления заданиями и являются частью оболочки. Они применяются к процессам и не влияют на то, какой процесс породил (выполнил) другой процесс.

Детский процесс является результатом вызова fork() - exec(). Ребенок получает родительский pid процесса, выполняющего вызов fork(). Это контекст сигнала SIGCHLD, родительский pid принимает сигнал SIGCHLD. Не имеет значения, является ли дочерний процесс «приоритетным» или «фоновым», только вопросы, связанные с выходом из процесса.

+0

Когда именно родитель отправляет 'SIGCHLD 'ignal? В коде, который я пишу, кажется, он отправляет его, как только он начинает выполняться, что кажется неправильным. – darksky

+0

Exectuable делает это как часть процесса rundown - часть, где он закрывает дескрипторы открытых файлов и т. Д., В то время как ваш процесс отключается. Существует (в зависимости от реализации) файл crt0.o (может иметь другие имена), который связан с каждым исполняемым изображением. У него есть некоторые точки входа, такие как _start(), _cleanup() и т. Д. Они вызывается после возврата main() или процесса вызывает _exit() или exit(). _start() вызывает main(), BTW. Во всяком случае, этот код отправляет сигнал родительскому. –

+0

@jimmcnamara: 'SIGCHLD' отправляется ядром. – ninjalj

2

Нет такой вещи, как ребенок переднего плана. Термин фоновой процесс используется просто для обозначения того, что мы в основном имеем дело с родительским процессом (который может создать дочерние процессы, чтобы сделать часть своей работы). Когда дочерний процесс завершается, SIGCHLD всегда отправляется в родительский процесс. Однако родительский процесс обычно игнорирует его. Если родитель хочет иметь дело с выходом из дочернего элемента или выполнить какое-либо действие только после выхода из него, он может использовать системный вызов wait(), чтобы получить статус дочернего процесса.

Смежные вопросы