-- ゾンビ プロセスの概念から得られるメリットは何ですか?
wait
ゾンビ プロセスは、pid、終了ステータス、および親がシステム コールのファミリの1 つを使用して最終ステータスを取得するまで保持される一部のアカウンティング情報です。親が子のプロセス ID を呼び出すまで、wait
他のプロセスが割り当てられないように、子のプロセス ID は使用済みとしてマークされたままにする必要があります。別のプロセスにリサイクルされた pid が割り当てられた場合、それと同じ pid を持つ以前のプロセスとの違いを見分けるのは困難です。一度wait
親によって呼び出され、最終的な終了ステータスを返します。誰もその pid で子を再び探しに行くことはないと想定できるため、pid は再利用される可能性があります。(Linuxでは、親がSIGCHLDをSIG_IGNのままにしておくと、カーネルはゾンビを保持しませんが、SIGCHLDの性質をSIG_IGNとして再登録しても同じ効果はありません)
-- カーネルがゾンビ プロセスの (PID、終了ステータス、リソース使用情報) を保持していることを知っています。「リソース使用情報」の意味は何ですか?
この情報の一部は、プログラムを次のように実行するものです。
time my_program
報告します。これらの値は通常、SIGCHLD の siginfo 構造体で報告されますが (正確には への呼び出しではありません) 、systme 呼び出しの形式wait
への呼び出しからも利用できます (システムによっては)。この構造については、 を参照waitid
してください。man sigaction
-- どのようにゾンビの PPID() = 1 であり、ゾンビのままか (init はデフォルトで wait() であるため、ゾンビをリープします)
ppid = 1 のゾンビは、 initがかなり迅速に刈り取る必要があるため、長時間ゾンビのままであってはなりません。プロセスは、親が呼び出して最終ステータスを取得するexit
まで、(プロセスを強制終了する unhanded シグナルを介して、またはプロセスを強制終了することによって) 死亡した直後の時点からゾンビのままになります。wait
これは、init が何もせずに init を何度も呼び出したとしても、プロセスがゾンビとして現れる可能性があるわずかな時間がある可能性があることを意味します。プロセスがinit (0=ppid) の子として長時間 (秒) 表示される場合は、おそらく何かが間違っています。
-- ゾンビの親を Init にする C コードを書ける人はいますか?
これは明確ではありませんが、あなたが望むと思います:
pid_t f = fork();
if (f > 0) {
exit(0); // this is the parent dying, so the child will be an orphan
// and get adopted by init
} else if (f == 0) {
sleep(100); // This is the child doing something that takes enough time for
// its parent to commit suicide (exit(0)) and then for you to
// observe that it has now been adopted by init
exit(0); // And now it dies as well, so init should reap its status, but
// it may be a zombie for a short amount of time first.
} else /* error condition would be handled here */
-- ゾンビはメモリのロックを解放することを拒否できますか??
ゾンビはほとんどのものをつかむことができません。それらはすべてのメモリ ページを失い、開いているファイル ハンドルなどを失います。オペレーティングシステムが解放する方法を理解できるほとんどすべてのものは、解放されるべきです。そうしないとバグになりますが、OS はそれが解放されるはずのものであることを認識している必要があることを覚えておいてください。ユーザー空間にリソースを作成するのは非常に簡単で、OS が解放すべきことを認識していないプログラムが終了したときに解放する必要があります。