コンピュータの オペレーティングシステムでは、プロセス(またはタスク)は、別のプロセスの実行が完了するまで待機することがあります。ほとんどのシステムでは、親プロセスは独立して実行される子プロセスを作成できます。親プロセスは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日閲覧。
