Linux - найдите всех детей умирающего процесса (моих внуков) - PullRequest
1 голос
/ 26 июля 2011

Сценарий: у нас есть демон linux, назовите его Alpha.Альфа разветвляется / исполняет дочерний процесс, Браво.Затем Браво порождает несколько дочерних процессов, называя их Чарли и Дельта.

Alpha
  |
   \-Bravo
     |
      \-Charlie
     |
      \-Delta

Браво умирает.В Alpha установлен дочерний обработчик sig, который запускается.

Как мне из Alpha найти всех детей Браво (Чарли и Дельта), чтобы я тоже мог их убить?

Я заметил, что после смерти Браво Чарли и Дельта становятся детьми init (pid = 1).Либо мне нужно уметь: 1) проверять дерево процессов ДО того, как дети Браво будут переназначены, либо 2) как-то гарантировать, что дети Браво наследуются Альфой.Если бы это было так, я мог бы разобраться, кто есть кто среди моих (Альфа) собственных детей.

1 Ответ

1 голос
/ 27 июля 2011

Для этого вы можете использовать группы процессов. Когда запускается Bravo, он становится лидером группы процессов, используя setpgid(0, 0);, прежде чем он вызовет execve(). Затем его потомки наследуют эту группу процессов (у которой PGID равен PID Bravo и, таким образом, известен Alpha).

Когда выходит Bravo, его потомки будут наследоваться init, но их PGID не изменится. Alpha может затем сигнализировать их всех за один раз, используя kill(), указав в качестве первого аргумента отрицательное значение PGID. Например. в Alpha вы можете сделать что-то вроде:

exited_child = wait(&status);
if (exited_child > 0)
     kill(-exited_child, SIGTERM);
...