Ребенок может попросить, чтобы ядро поставило SIGHUP
(или другой сигнал), когда родитель умирает путем определения опции PR_SET_PDEATHSIG
в prctl()
syscall как это:
prctl(PR_SET_PDEATHSIG, SIGHUP);
См. man 2 prctl
для деталей.
Редактирование: Это только для Linux
Под POSIX, exit()
, _exit()
и _Exit()
функции определяются к:
Так, если Вы принимаете меры, чтобы родительский процесс был процессом управления для своей группы процесса, ребенок должен получить сигнал SIGHUP, когда родитель выходит. Я не абсолютно уверен, что это происходит, когда родитель отказывает, но я думаю, что он делает. Конечно, для случаев некатастрофического отказа, это должно хорошо работать.
Примечание, что Вам, вероятно, придется считать довольно много мелкого шрифта - включая раздел Base Definitions (Definitions), а также информацию о Системных службах для exit()
и setsid()
и setpgrp()
- для получения полного изображения. (Я тоже!)
Установите обработчик прерываний для ловли SIGINT, который избавляется от дочернего процесса, если это все еще живо, хотя другие плакаты корректны, что это не поймает SIGKILL.
Открывают .lockfile с эксклюзивным доступом и имеют дочерний опрос на нем пытающийся открыть его - если открытое успешно выполняется, дочерний процесс должен выйти
Я не полагаю, что возможно гарантировать, что использование только стандартный POSIX звонит. Как реальная жизнь, когда-то ребенок порожден, это имеет собственную жизнь.
для родительского процесса возможно поймать большинство возможных событий завершения и попытаться уничтожить дочерний процесс в той точке, но всегда существуют некоторые, которые не могут быть пойманы.
, Например, никакой процесс не может поймать SIGKILL
. Когда ядро обработает этот сигнал, это уничтожит указанный процесс без уведомления тому процессу вообще.
Для расширения аналогии - единственный другой стандартный способ сделать это для ребенка для совершения самоубийства, когда это находит, что больше не имеет родителя.
существует способ только для Linux сделать, он с prctl(2)
- видит другие ответы.
Дочерний процесс имеет канал к/от родительскому процессу? Если так, Вы получили бы SIGPIPE при записи или получили бы EOF при чтении - эти условия могли быть обнаружены.
Я достиг этого в прошлом путем выполнения "исходного" кода в "ребенке" и "порожденного" кода в "родителе" (который является: Вы инвертируете обычный смысл теста после fork()
). Тогда захватите SIGCHLD в "порожденном" коде...
май не быть возможным в Вашем случае, но милым, когда это работает.
Я пытаюсь решить ту же самую проблему, и так как моя программа должна работать под OS X, решение только для Linux мне не помогло.
Я пришел к тому же выводу, что и другие люди на этой странице - нет POSIX-совместимого способа уведомить ребенка, когда умирает родитель. Так что я подумал о следующем - опросе детей.
Когда родительский процесс умирает (по любой причине), родительский процесс дочернего процесса становится процессом 1. Если дочерний процесс просто периодически опрашивает, то он может проверить, что его родитель - 1. Если это так, то дочерний процесс должен выйти из процесса.
Это не очень хорошо, но работает, и это проще, чем решения по опросу TCP сокетов/блокировок, предложенные в других местах на этой странице.