2011-07-26 11 views
1

シナリオ:私たちはLinuxデーモンを持っています。 Alpha forks/execsは子プロセスBravoをフォークします。ブラボーはいくつかの子プロセスを生成し、チャーリーとデルタと呼んでいます。Linux - 死に至るプロセス(自分自身の孫)のすべての子供を見つける

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

ブラボーが死ぬ。 Alphaにはsig子ハンドラがインストールされています。これは起動します。

私はAlphaからブラボー(チャーリーとデルタ)のすべての子供たちを見つけても、私もそれらを殺すことができますか?

私が観察したことは、ブラボーがいったん殺されると、チャーリーとデルタはinitの子になります(pid = 1)。ブラボーの子供が再割り当てされる前にプロセスツリーを調べること、または2)ブラボーの子供がアルファによって継承されていることをどうにかすることができることが必要です。それが事実なら、私は(アルファの)自分の子供たちのなかにいた人を選別することができました。

答えて

1

このためにプロセスグループを使用できます。 Bravoが起動すると、を使用してプロセスグループのリーダーになり、execve()が呼び出されます。その子プロセスは、このプロセスグループ(PGIDがBravoのPIDに等しいため、Alphaに知られています)を継承します。

Bravoが終了すると、その子はinitに継承されますが、そのPGIDは変更されません。 Alphaは、kill()を使用してそれらをすべて一度に通知し、最初の引数としてPGIDの負数を指定します。例えば。 Alphaであなたは次のようなことをするかもしれません:

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

素晴らしいです。私はあなたの提案をテストしました。これはまさに私が必要としていたものです。 –

関連する問題