Linuxコマンドを学ぶ - 待つ

wait、waitpid - プロセスの終了を待つ

シノプシス

#include
#include

pid_t wait(int * status );
pid_t waitpid(pid_t pid 、int * ステータス 、int オプション );

説明

wait関数は、子プロセスが終了するまで、または現在のプロセスを終了するかシグナル処理関数を呼び出すことがアクションであるシグナルが送信されるまで、現在のプロセスの実行を中断します。 コールの時点までに子供が既に退出している場合(いわゆる「ゾンビ」プロセス)、関数はすぐに戻る。 子が使用するシステムリソースはすべて解放されます。

waitpid関数は、 pid引数で指定された子が終了するまで、または現在のプロセスを終了するか、シグナルハンドリング関数を呼び出すようなシグナルが送られるまで、現在のプロセスの実行を中断します。 pidによって要求された子がコール時までに既に終了している場合(いわゆる「ゾンビ」プロセス)、関数は直ちに戻ります。 子が使用するシステムリソースはすべて解放されます。

pidの値は次のいずれかになります。

<-1

プロセスグループIDがpidの絶対値と等しい子プロセスを待つことを意味します。

-1

子プロセスを待つことを意味します。 これは待っているのと同じ動作です。

0

プロセスグループIDが呼び出しプロセスのIDと等しい子プロセスを待つことを意味します。

> 0

これは、プロセスIDがpidの値と等しい子を待つことを意味します。

オプションの値は、次の定数のうちの0以上のORです。

WNOHANG

これは、子供が出ていない場合にすぐに戻ることを意味します。

勝つ

これは、停止しており、そのステータスが報告されていない子供たちにも戻ることを意味します。

(Linuxのみのオプションについては、以下を参照してください)。

statusNULLでなければ、 waitまたはwaitpidはステータスによって指し示される位置にステータス情報を格納します

この状態は次のマクロで評価することができます(これらのマクロはstatバッファ( int )を引数として取る---バッファへのポインタではありません!):

WIFEXITED( ステータス

子が正常に終了した場合はゼロ以外です。

WEXITSTATUS( ステータス

exit()の呼び出しの引数として、またはメインプログラムのreturn文の引数として設定されている、終了した子の戻りコードの最下位8ビットを評価します。 このマクロは、 WIFEXITEDがゼロ以外の値を返した場合にのみ評価できます。

WIFSIGNALED( ステータス

キャッチされなかったシグナルのために子プロセスが終了した場合はtrueを返します。

WTERMSIG( ステータス

子プロセスが終了する原因となったシグナルの番号を返します。 このマクロは、 WIFSIGNALEDがゼロ以外の値を返した場合にのみ評価できます。

WIFSTOPPED( ステータス

戻りを引き起こした子プロセスが現在停止している場合はtrueを返します。 これは、呼び出しがWUNTRACEDを使用して行われた場合にのみ可能です。

WSTOPSIG( ステータス

子を停止させたシグナルの番号を返します。 このマクロは、 WIFSTOPPEDがゼロ以外の値を返した場合にのみ評価できます。

いくつかのUnix(Linux、Solaris、AIX、SunOSは除く )の一部のバージョンでは、子プロセスがコアをダンプしたかどうかをテストするマクロWCOREDUMP( status も定義しています。 これは、#ifdef WCOREDUMP ... #endifで囲んで使用してください。

戻り値

終了した子のプロセスID。WNOHANGが使用され、子が利用できなかった場合は0、エラーの場合は-1( errnoが適切な値に設定されている)

エラー

ECHILD

で指定されたプロセス pidは存在しないか、呼び出しプロセスの子ではありません。 (これは、SIGCHLDのアクションがSIG_IGNに設定されている場合、自分の子供のために起こる可能性があります。スレッドに関するLINUX NOTESセクションも参照してください)。

EINVAL

options引数が無効だった場合

EINTR

WNOHANGが設定されておらず、ブロックされていないシグナルまたはSIGCHLDが検出された場合。