回答:
ゾンビプロセスはすでに死んでいます。それらを殺すことはできません。kill
コマンドまたはシステムコールは、ゾンビプロセスには影響を与えません。(でゾンビを消滅させることができkill
ますが、すぐにわかるように、ゾンビではなく親を撃つ必要があります。)
ゾンビプロセスは実際にはプロセスではなく、プロセステーブルのエントリにすぎません。ゾンビプロセスに関連付けられている他のリソースはありません。メモリや実行中のコードがなく、ファイルを開いたままにしないなどです。
プロセスが停止した場合、他のすべてのリソースがクリーンアップされた後、最後に行くのはプロセステーブルのエントリです。このプロセスは、親プロセスが子プロセスの終了ステータスを追跡できるように、ゾンビを形成するために保持されます。親wait
は、syscallsファミリーの1つを呼び出すことによって終了ステータスを読み取ります。この時点で、ゾンビは消えます。呼び出しwait
は子供を刈り取ると言われ、ゾンビが死んでいるという比metaを広げていますが、まだ何らかの方法で死後まで完全に処理されていません。親は、(SIGCHLDシグナルを無視するかsigaction
、SA_NOCLDWAIT
フラグを使用して呼び出すことにより)気にしないことを示すこともできます。この場合、子が死んだときにプロセステーブルのエントリがすぐに削除されます。
したがって、ゾンビは、プロセスが終了し、その親がまだ呼び出されていない場合にのみ存在しwait
ます。この状態は、親がまだ実行されている間のみ持続できます。親が子より前に死亡した場合、または子のステータスを読み取らずに死亡した場合、ゾンビの親プロセスはPID 1のプロセスに設定されinit
ます。の仕事の1つは、ループinit
を呼び出しwait
て、親によって残されたゾンビプロセスを回収することです。
プロセスの親が死ぬとすぐに、プロセスは孤児になります-ゾンビであるかどうかは無視します。孤児はどうなりますか?彼らはと呼ばれる新しい親を取得しinit
ます。init
うwait
、それはこのようにして孤立を刈り取り、収集された各孤児に(つまりもよくとしてゾンビされていてもよいです)。
init
ても、プロセスを殺すことはありません。それはwait
彼らのステータスを収集するためにその子供にのみです。