コンピュータのオペレーティングシステムでは、プロセス(またはタスク)は、別のプロセスの実行が完了するまで待機することがあります。ほとんどのシステムでは、親プロセスは独立して実行される子プロセスを作成できます。親プロセスはwaitシステムコールを発行し、子プロセスの実行中は親プロセスの実行を一時停止します。子プロセスが終了すると、オペレーティングシステムに終了ステータスを返します。このステータスは、待機中の親プロセスに返されます。その後、親プロセスは実行を再開します。[ 1 ]
最新のオペレーティング システムでは、プロセスのスレッドが他のスレッドを作成し、同様の方法でそれらのスレッドが終了するのを待つ (「参加」する) ことを可能にするシステム コールも提供されています。
オペレーティング システムでは、プロセスがその子プロセスのいずれかが終了するまで待機したり、特定の子プロセス (プロセス IDで識別される) が終了するまで待機したりできるように、 wait呼び出しのバリエーションを提供することがあります。
一部のオペレーティング システムでは、子プロセスが終了すると親プロセスにシグナル( SIGCHLD ) が発行され、親プロセスに通知されて子プロセスの終了ステータスを取得できるようになります。
子プロセスから返される終了ステータスは、通常、プロセスが正常に終了したか異常終了したかを示します。正常終了の場合、このステータスには、プロセスがシステムに返した終了コード(通常は整数値)も含まれます。UNIXの最初の20年間は、待機中の親プロセスは終了コードの下位8ビットしか利用できませんでした。1989年のSVR4では、新しい呼び出しwaitid が導入されました。この呼び出しは、終了呼び出しからのすべてのビットを、構造体メンバーsi_statusのsiginfo_tと呼ばれる構造体に返します。waitid は、2001年以降、POSIX標準の必須部分となっています。
ゾンビと孤児
子プロセスが終了すると、ゾンビプロセスとなり、アクティブに実行されているプログラムではなくなった後も、システムプロセステーブルにエントリとして存在し続けます。通常の動作では、通常、親プロセスは直ちに子プロセスを待機させ、その後システムによって回収され、リソース(プロセステーブルエントリ)が再利用されます。子プロセスが親プロセスから待機されない場合、子プロセスはこのリソースを無期限に消費し続けるため、リソースリークが発生します。このような状況は通常、ゾンビプロセスを特定して終了ステータスを取得し、オペレーティングシステムがリソースの割り当てを解除できるようにする特別な「リーパー」プロセスによって処理されます。
逆に、親プロセスが子プロセスよりも先に終了した場合、子プロセスは孤立プロセスになります。このような状況は通常、特別な「ルート」(または「init」)プロセスによって処理されます。このプロセスは、親プロセスが終了した際に、新しい親プロセスとして割り当てられます。この特別なプロセスは、孤立プロセスの終了を検出し、その終了ステータスを取得することで、システムが終了した子プロセスの割り当てを解除します。
子プロセスがシグナルを受信すると、待機中の親プロセスは孤立したプロセスを残して実行を継続します。そのため、wait、waitpid、またはwaitidで設定された引数を確認し、WIFSIGNALEDがtrueの場合は、子プロセスがリソースを解放するまで再度待機する必要がある場合があります。
参照
参考文献
- ^ 「C言語でのWaitシステムコール」 . GeeksforGeeks . 2017年6月3日. 2023年5月15日閲覧。