そのため、子が死ぬと親は get を取得しますSIGCHLD
が、親が wait() を実行する前に死ぬと、子の親は に変更されinit
ます。この時点で、子はzombie
ie<defunct>
です。
次は何が起こる?
その子に wait() を実行しますかinit
? はいの場合、いつそれを行いますか? 制限時間に関する保証はありますか?
そのため、子が死ぬと親は get を取得しますSIGCHLD
が、親が wait() を実行する前に死ぬと、子の親は に変更されinit
ます。この時点で、子はzombie
ie<defunct>
です。
次は何が起こる?
その子に wait() を実行しますかinit
? はいの場合、いつそれを行いますか? 制限時間に関する保証はありますか?
はい、init
すぐにすべての子供を刈り取ります。多くのゾンビを無視しSIGCHLD
て蓄積するプロセスを作成する場合は、説明するメカニズムを介してその親を殺すことでゾンビを取り除くことができます。
init
参考までに、マルチユーザーモードで のメインループを示します。requested_transition
シグナリングによって設定されます(たとえば、更新されたものを読み取るためinit
のクラシック):kill -1 1
inittab
while (!requested_transition)
if ((pid = waitpid(-1, (int *) 0, 0)) != -1)
collect_child(pid);
(collect_child
ログインシェルが新しいものを必要とするなど、initがプロセスに特別な関心を持っている場合を処理しますgetty
)