8

プロセスが適切にクリーンアップされない場合(そのリソースが再利用/取得されない場合)にゾンビが作成されることを理解しています。fork()を呼び出して新しいプロセスを作成した後、親は常にそのプロセスでwaitpidを呼び出してクリーンアップする必要があります。

また、デーモンは、それ自体がforkによって作成された子をフォークし、その子を死なせることによって作成されることも学びました。どうやら、UNIXのinitプロセス(pid#1)は、これを実行するとプロセスを管理するようになります。

私が知りたいのは、私が知る限り、親が死ぬと自動的に子をクリーンアップするということです。そもそもゾンビはどのようにして作成されるのでしょうか。

次に、デーモン化されたプロセスの親が消滅します。それでは、デーモン化されたプロセスがゾンビと見なされないのはなぜですか。

4

2 に答える 2

15

私が知りたいのは、私が知る限り、親が死ぬと自動的に子をクリーンアップするということです。そもそもゾンビはどのようにして作成されるのでしょうか。

いいえ、親は子を自動的にクリーンアップしません。プロセスが終了するたびに、そのすべての子(実行中またはゾンビ)がinitプロセスに採用されます。

ゾンビは、すでに終了している子プロセスであり、親がまだ生きているがwait、終了ステータスを取得するためにまだ呼び出されていないときに存在します。親が死んだ場合(そして呼び出していない場合wait)、ゾンビの子はすべてinitプロセスに養子縁組され、最終的にはwaitすべての子に刈り取りを要求するため、プロセステーブルから消えます。

ゾンビプロセスを維持する背後にある考え方は、親がを介して興味を持った場合に備えて、プロセスの終了に関する適切なデータ構造を維持することwaitです。

次に、デーモン化されたプロセスの親が消滅します。それでは、デーモン化されたプロセスがゾンビと見なされないのはなぜですか。

デーモン化されたプロセスの親は消滅しますが、デーモン化されたプロセスは制御端末から切り離され、setsidシステムコールを介してプロセスグループリーダーになります。

于 2011-09-02T14:44:49.420 に答える
0

子プロセスが開始されると、親プロセスIDとともにカーネルレベルで作成されたエントリがあります。何らかの理由(サーバーの手、アプリケーションの終了から親プロセスが強制終了されたなど)により、親プロセスが強制終了され、子プロセスが残されました。カーネルはそのようなプロセスをクリーンアップできません。親プロセスのみがそうすることを許可されています。そのようなプロセスはまだカーネルのテーブルにあるので、リソースも消費していますが、何もしていません。だから、それはゾンビと呼ばれています。

于 2013-01-17T09:16:40.123 に答える