Как заставить дочерний процесс умереть после родительских выходов?

199
задан Community 23 May 2017 в 02:03
поделиться

7 ответов

Ребенок может попросить, чтобы ядро поставило SIGHUP (или другой сигнал), когда родитель умирает путем определения опции PR_SET_PDEATHSIG в prctl() syscall как это:

prctl(PR_SET_PDEATHSIG, SIGHUP);

См. man 2 prctl для деталей.

Редактирование: Это только для Linux

179
ответ дан qrdl 23 November 2019 в 05:09
поделиться

Под POSIX, exit(), _exit() и _Exit() функции определяются к:

  • , Если процесс является процессом управления, сигнал SIGHUP должен быть отправлен в каждый процесс в группе приоритетного процесса терминала управления, принадлежащего обработке вызовов.

Так, если Вы принимаете меры, чтобы родительский процесс был процессом управления для своей группы процесса, ребенок должен получить сигнал SIGHUP, когда родитель выходит. Я не абсолютно уверен, что это происходит, когда родитель отказывает, но я думаю, что он делает. Конечно, для случаев некатастрофического отказа, это должно хорошо работать.

Примечание, что Вам, вероятно, придется считать довольно много мелкого шрифта - включая раздел Base Definitions (Definitions), а также информацию о Системных службах для exit() и setsid() и setpgrp() - для получения полного изображения. (Я тоже!)

1
ответ дан Jonathan Leffler 23 November 2019 в 05:09
поделиться

Установите обработчик прерываний для ловли SIGINT, который избавляется от дочернего процесса, если это все еще живо, хотя другие плакаты корректны, что это не поймает SIGKILL.

Открывают .lockfile с эксклюзивным доступом и имеют дочерний опрос на нем пытающийся открыть его - если открытое успешно выполняется, дочерний процесс должен выйти

4
ответ дан Ana Betts 23 November 2019 в 05:09
поделиться

Я не полагаю, что возможно гарантировать, что использование только стандартный POSIX звонит. Как реальная жизнь, когда-то ребенок порожден, это имеет собственную жизнь.

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

, Например, никакой процесс не может поймать SIGKILL. Когда ядро обработает этот сигнал, это уничтожит указанный процесс без уведомления тому процессу вообще.

Для расширения аналогии - единственный другой стандартный способ сделать это для ребенка для совершения самоубийства, когда это находит, что больше не имеет родителя.

существует способ только для Linux сделать, он с prctl(2) - видит другие ответы.

7
ответ дан Alnitak 23 November 2019 в 05:09
поделиться

Дочерний процесс имеет канал к/от родительскому процессу? Если так, Вы получили бы SIGPIPE при записи или получили бы EOF при чтении - эти условия могли быть обнаружены.

11
ответ дан MarkR 23 November 2019 в 05:09
поделиться

Я достиг этого в прошлом путем выполнения "исходного" кода в "ребенке" и "порожденного" кода в "родителе" (который является: Вы инвертируете обычный смысл теста после fork()). Тогда захватите SIGCHLD в "порожденном" коде...

май не быть возможным в Вашем случае, но милым, когда это работает.

34
ответ дан dmckee 23 November 2019 в 05:09
поделиться

Я пытаюсь решить ту же самую проблему, и так как моя программа должна работать под OS X, решение только для Linux мне не помогло.

Я пришел к тому же выводу, что и другие люди на этой странице - нет POSIX-совместимого способа уведомить ребенка, когда умирает родитель. Так что я подумал о следующем - опросе детей.

Когда родительский процесс умирает (по любой причине), родительский процесс дочернего процесса становится процессом 1. Если дочерний процесс просто периодически опрашивает, то он может проверить, что его родитель - 1. Если это так, то дочерний процесс должен выйти из процесса.

Это не очень хорошо, но работает, и это проще, чем решения по опросу TCP сокетов/блокировок, предложенные в других местах на этой странице.

66
ответ дан 23 November 2019 в 05:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: