
ゾンビプロセスはUnix / Linuxシステムで作成されます。kill
コマンドで削除できます。
しかし、Linuxにはゾンビプロセスを処理するための組み込みクリーンアップメカニズムはありますか?
答え1
ゾンビプロセスが終了しました。あなたはそれらを殺すことはできません。コマンドkill
やシステムコールはゾンビプロセスには影響しません。 (ゾンビを追い出すことはできますが、kill
後で見てみましょうが、ゾンビではなく両親を撃つ必要があります。)
ゾンビプロセスは実際のプロセスではなく、プロセステーブルのエントリにすぎません。ゾンビプロセスに関連する他のリソースはありません。メモリや実行コードはなく、開いているファイルも保持しません。
プロセスが終了すると、他のすべてのリソースがクリーンアップされた後に最後に消えるのは、プロセステーブルのエントリです。このアイテムはゾンビを形成し、親プロセスが子プロセスの終了状態を追跡できるようにします。親は次のいずれかを呼び出して終了ステータスを読み取ります。wait
システムコールファミリーこの時点でゾンビは消えます。wait
電話が来たそうです。報酬The Childはゾンビが死んだが、ある意味ではまだ完全に死後の世界にいないというたとえ話を拡張しています。親はまた、(SIGCHLD信号を無視するか、次を呼び出すことによって)相関しないことを示してもよい。sigaction
フラグSA_NOCLDWAIT
)、この場合、プロセステーブルのエントリは子プロセスが終了するとすぐに削除されます。
したがって、ゾンビはプロセスが終了し、その親がまだ呼び出されていない場合にのみ存在しますwait
。この状態は、親プロセスが継続して実行されている間だけ持続します。親プロセスが子プロセスの前に死んだ場合、または子プロセスの状態を読み取らずに死んだ場合、ゾンビプロセスの親プロセスはPID 1を持つプロセスに設定されます。init
。そのうちの1つinit
は、wait
呼び出しを繰り返して親が残したゾンビプロセスを選択することです。
答え2
kill
すでに死んでいるので、ゾンビプロセスではありません。
wait
終了ステータスを収集するには、ゾンビプロセスを親プロセスで編集する必要があります。
Linuxの唯一の「組み込みクリーンアップメカニズム」は、子プロセスの終了状態を収集する前に親プロセスが終了するすべての状況に適用されます。この場合、各子プロセスはプロセスによって継承されinit
、プロセスは子wait
プロセスの終了ステータスを収集し、プロセステーブルからそのエントリを削除します。
答え3
プロセスの親が死ぬと、プロセスはゾンビプロセスかどうかに関係なく孤児になります。孤児はどうなりますか?彼らは名前が新しい親ですinit
。収集したすべての孤児にinit
対処し、wait
孤児(およびゾンビ)を収穫します。
答え4
いいえ、ゾンビクリーンアップメカニズムは組み込まれていません。親が死ぬと、ゾンビはゾンビの天国に入ります。それまで、オペレーティングシステムは終了ステータスを親エントリとして返すようにします。