Дочерние процессы умирают при убийстве родителя, если один из них остановлен с помощью SIGSTOP - PullRequest
12 голосов
/ 04 декабря 2010

Мой тестовый код

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main() {
  int c = fork();
  if (c == 0) while(1);
  c = fork();
  if (c == 0) while(1);
  c = fork();
  if (c == 0) while(1);
  c = fork();
  if (c == 0) while(1);
  while(1);
}

Итак, у меня один родитель и 4 ребенка.Когда я убиваю родителя, childs прекрасно работает с init в качестве родителя.Но если я остановлю (с помощью SIGSTOP) одного из потомков, а затем убью родителя, тоже будут убиты потомки.Почему это так?

Ответы [ 2 ]

13 голосов
/ 04 декабря 2010

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

http://www.win.tue.nl/~aeb/linux/lk/lk-10.html

Из приведенной выше ссылки:

Если завершение процесса вызывает процесс группы стать сиротами, и какой-то член остановлен, тогда все отправил сначала SIGHUP, а затем SIGCONT.

Идея в том, что, возможно, родитель руководитель группы процессов - это работа контрольная оболочка. (В том же сеансе но другая группа процессов.) Как Пока этот родитель жив, он может справиться с остановкой и запуском члены в группе процессов. Когда это умирает, возможно, некому продолжать остановленные процессы. Поэтому эти остановленные процессы отправляются SIGHUP, поэтому что они умирают, если они не поймают или игнорировать его, а затем SIGCONT продолжайте их.

EDIT:

Кстати, strace - замечательный инструмент для понимания сути подобных вещей. Если вы присоедините strace к одному из дочерних процессов, вы увидите, что SIGHUP доставляется, только если один из них останавливается, когда родитель (т.е. лидер группы процессов) умирает.

Вам необходимо изменить обработчик для SIGHUP, используя, например, sigaction (2), если вы хотите, чтобы процессы потомков выжили.

0 голосов
/ 04 декабря 2010

Дочерние элементы принадлежат к той же группе процессов, что и родительский процесс, и поэтому уничтожаются вместе со своим родительским процессом.

Подсказка: не используйте while(1); для приостановки процесса.Пусть это sleep бесконечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...