Обработка сигналов SIGCHLD

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

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

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


person darksky    schedule 23.03.2012    source источник
comment
Да, я полагаю, что SIGCHLD также отправляется для процессов переднего плана. Вы можете проверить с помощью strace.   -  person Basile Starynkevitch    schedule 24.03.2012


Ответы (2)


фон и передний план — это концепции управления заданиями, которые являются частью оболочки. Они применяются к процессам и не влияют на то, какой процесс породил (выполнил) другой процесс.

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

person jim mcnamara    schedule 23.03.2012
comment
Когда именно родитель посылает сигнал SIGCHLD? В коде, который я пишу, кажется, что он отправляет его, как только начинает выполняться, что кажется неправильным. - person darksky; 24.03.2012
comment
Исполняемый файл делает это как часть избегания процесса - часть, в которой он закрывает дескрипторы открытых файлов и т. д., пока ваш процесс останавливается. Существует (в зависимости от реализации) файл crt0.o (может иметь другие имена), который связан с каждым исполняемым образом. У него есть несколько точек входа, таких как _start(), _cleanup() и т. д. Они вызываются после того, как ваш main() возвращает или процесс вызывает _exit() или exit(). _start() вызывает main(), кстати. В любом случае, этот код отправляет сигнал родителю. - person jim mcnamara; 24.03.2012
comment
@jimmcnamara: SIGCHLD отправляется ядром. - person ninjalj; 25.03.2012
comment
@ninjali - ядро ​​действительно ДОСТАВЛЯЕТ сигнал. Например, при взгляде на HPUX 10i связанный объект вызывает сигнал через kill. - person jim mcnamara; 25.03.2012
comment
Разве это не назад? В соответствии со стандартом POSIX родитель получает pid дочернего элемента, а дочерний — 0. pubs.opengroup.org/onlinepubs/009695399/functions/fork.html - person Rahly; 17.09.2015

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

person P.P    schedule 23.03.2012