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