親プロセスが死んだ子プロセスの終了ステータスを受け取ると、wait
実際に子プロセスのメモリを再割り当てし、プロセステーブルから削除する人が誰であるかを説明できますか?
答え1
プロセステーブルとメモリマップの操作は常にカーネルの操作です。プロセスがシステムコールを行うと、カーネルはアクションを取ります。プロセスが終了すると、プロセスが使用したすべてのリソース(プロセステーブルのエントリを除くメモリを含む)が削除されます。これが_exit
システムコールが実行するアクションです。次に、親プロセスがまたはをwait
呼び出すとき、waitpid
そのシステムコール操作の一部はプロセステーブルエントリをクリーンアップすることです。親プロセスはwait
必要に応じて呼び出すことができます(親プロセスがあればほぼ常にinit
呼び出さwait
れます)。
答え2
カーネルは、親プロセスが自分が分岐する子プロセスの結果を知りたいと仮定します。子プロセスが終了すると、自動的にSIGCHLD
親プロセスにシグナルを送信します。親プロセスが明示的にSIGCHLD
シグナルを無視すると、子プロセスはすぐにクリーンアップされ、完全に削除されます(そしてゾンビプロセスにはなりません)。それ以外の場合、親プロセスが子プロセスwait
から終了ステータスを取得する関数の1つを呼び出すまで、子プロセスはゾンビプロセスになります。
状態が検索されない場合、子はゾンビのままです。ただし、親プロセスが子プロセスの前に終了すると、子プロセスがinit
採用され(プロセス1)、すぐに状態を収集してゾンビプロセスを効果的に削除します。