Подтвердить что ты не робот

Детские процессы умирают при убийстве родителя, если один из них остановлен с помощью SIGSTOP

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

#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) одним из детей, а затем убью родителя, также будут убиты дети. Почему это так?

4b9b3361

Ответ 1

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

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

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

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

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

EDIT:

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

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

Ответ 2

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

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