子供が親を亡くすときにはSIGCHLD
が得られますが、親がwait()を実行する前に亡くなった場合、子はinit
になります。この時点で子供はzombie
、すなわち<defunct>
です。未完成の子とその未来
次はどうなりますか?
init
はその子を待っていますか?はいの場合、それはいつですか?時間制限に関する保証はありますか?
子供が親を亡くすときにはSIGCHLD
が得られますが、親がwait()を実行する前に亡くなった場合、子はinit
になります。この時点で子供はzombie
、すなわち<defunct>
です。未完成の子とその未来
次はどうなりますか?
init
はその子を待っていますか?はいの場合、それはいつですか?時間制限に関する保証はありますか?
はい、init
はい、すぐにすべての子供を拾います。あなたがSIGCHLD
を無視し、多くのゾンビを蓄積するプロセスを作るなら、あなたが説明するメカニズムを介してその親を殺すことによってそれらを取り除くことができます。
ここでは、マルチユーザーモードのメインループinit
を参照しています。 requested_transition
は(更新inittab
を読み取るために例えば古典kill -1 1
)init
をシグナリングすることによって設定されます。
while (!requested_transition)
if ((pid = waitpid(-1, (int *) 0, 0)) != -1)
collect_child(pid);
(collect_child
は、このような新しいgetty
が必要なログインシェルとしてinitはプロセス内のいくつかの特別な関心を持っている場合に、ハンドル)
Benさんに感謝します。 'init'がすぐにreapする場合、wait()を行うSIGCHLDの明示的なハンドラを定義するのは意味がありませんか?私はそのようなハンドラを持つことは非常に有用であることを経験しました。それは 'init'よりもずっと速く「収穫」します。同意しますか? – hari
あなたのプロセスが*まだ生きていれば、それはあなたが収穫するまでです。あなたのプロセスが終了するまでゾンビを放置するのは悪いです。それが無制限の数なら、あなたはprocsからあなた自身を動かすことができます。 –
ベンに感謝します。ところで、あなたが提供したコードスニペットに従っていません。それは興味があるように見える:)あなたはそれを詳しく教えてもらえますか?私はfreebsdのソースを見ていて、そのようなコードブロックを見つけることはできません。 – hari
あなたの文言はわかりませんが、明確にするために、子供はその死とその親(元の親またはinitのいずれか)がそれを待つ間のゾンビです。あなたの質問の文言は、親が死亡した後、子供はゾンビになることを意味します。 –