2011-12-13 12 views
1

子供が親を亡くすときにはSIGCHLDが得られますが、親がwait()を実行する前に亡くなった場合、子はinitになります。この時点で子供はzombie、すなわち<defunct>です。未完成の子とその未来

次はどうなりますか?

initはその子を待っていますか?はいの場合、それはいつですか?時間制限に関する保証はありますか?

+0

あなたの文言はわかりませんが、明確にするために、子供はその死とその親(元の親またはinitのいずれか)がそれを待つ間のゾンビです。あなたの質問の文言は、親が死亡した後、子供はゾンビになることを意味します。 –

答えて

2

はい、initはい、すぐにすべての子供を拾います。あなたがSIGCHLDを無視し、多くのゾンビを蓄積するプロセスを作るなら、あなたが説明するメカニズムを介してその親を殺すことによってそれらを取り除くことができます。

ここでは、マルチユーザーモードのメインループinitを参照しています。 requested_transitionは(更新inittabを読み取るために例えば古典kill -1 1initをシグナリングすることによって設定されます。

while (!requested_transition) 
      if ((pid = waitpid(-1, (int *) 0, 0)) != -1) 
        collect_child(pid); 

collect_childは、このような新しいgettyが必要なログインシェルとしてinitはプロセス内のいくつかの特別な関心を持っている場合に、ハンドル)

+0

Benさんに感謝します。 'init'がすぐにreapする場合、wait()を行うSIGCHLDの明示的なハンドラを定義するのは意味がありませんか?私はそのようなハンドラを持つことは非常に有用であることを経験しました。それは 'init'よりもずっと速く「収穫」します。同意しますか? – hari

+1

あなたのプロセスが*まだ生きていれば、それはあなたが収穫するまでです。あなたのプロセスが終了するまでゾンビを放置するのは悪いです。それが無制限の数なら、あなたはprocsからあなた自身を動かすことができます。 –

+0

ベンに感謝します。ところで、あなたが提供したコードスニペットに従っていません。それは興味があるように見える:)あなたはそれを詳しく教えてもらえますか?私はfreebsdのソースを見ていて、そのようなコードブロックを見つけることはできません。 – hari