WAIT(2)

名称
wait, waitpid, wait4, wait3 - プロセスの終了待機

ライブラリ
libc

書式
<sys/types.h> <sys/wait.h> pid_t wait(int *status) <sys/time.h> <sys/resource.h> pid_t waitpid(pid_t wpid, int *status, int options) pid_t wait3(int *status, int options, struct rusage *rusage) pid_t wait4(pid_t wpid, int *status, int options, struct rusage *rusage)

解説
wait() 関数は、終了した子プロセスの status 情報が使用できるようになるまで、またはシグナルを受信するまで、 呼び出しプロセスの実行を停止します。 wait() 呼び出しが成功すると、 status 領域には下の定義のように終了したプロセスの終了情報が入ります。

wait4() システムコールは、特定の子プロセスを待つ必要があり、子プロセスが蓄積した リソース利用統計あるいはオプションを必要とするプログラムのために、 より一般的なインタフェースを提供します。 その他の待機関数は、 wait4() を使用して実装されています。

wpid 引数は待つべき子プロセスの集合を指定します。 wpid が -1 である場合、この呼び出しはすべての子プロセスを待ちます。 wpid が 0 である場合、この呼び出しは、呼び出し側のプロセスグループの すべての子プロセスを待ちます。 wpid が 0 より大きい場合、この呼び出しはプロセス ID が wpid であるプロセスを待ちます。 wpid が -1 より小さい場合、呼び出しは、プロセスグループ ID が wpid の絶対値に等しいプロセスを待ちます。

status 引数は、以下のように定義されています。 options 引数には、以下の任意のオプションのビット論理和が入ります。 WCONTINUED オプションは、カレントプロセスの子プロセスで、ジョブ制御の停止状態から SIGCONT シグナルを受け取って復帰したプロセスのステータスも 報告するべきであることを示します。 WNOHANG オプションは、ステータスを報告するプロセスがない場合に呼び出しが ブロックしないことを示すために使用します。 WUNTRACED オプションを設定すると、 SIGTTIN, SIGTTOU, SIGTSTP, SIGSTOP シグナルのために停止したカレントプロセスの子にも、 そのステータスを報告させます。

rusage が 0 以外である場合は、終了したプロセスと そのすべての子が使用したリソースのサマリが返されます (現在のところ、この情報は停止したプロセスについては使用できません)。

WNOHANG オプションが指定され、ステータスを報告するプロセスがない場合、 wait4() はプロセス ID 0 を戻します。

waitpid() 関数は、 rusage の値を 0 にした wait4() と同じです。 古い wait3() 呼び出しは、 wpid の値を -1 にした wait4() と同じです。

以下のマクロは、プロセスの終了の仕方を知るのに使用できます。 最初の 3 つのマクロは、0 以外 (真) の値を評価します:

WIFCONTINUED(status)
    プロセスが終了しておらず、ジョブ制御の停止状態のあと復帰した場合に 真となります。 このマクロは wait 呼び出しに WCONTINUED オプションが指定された場合のみ真となります。

WIFEXITED(status)
    _exit(2) か exit(3) を呼び出し、プロセスが正常に終了した場合に真となります。

WIFSIGNALED(status)
    シグナルを受信したためにプロセスが終了した場合に真となります。

WIFSTOPPED(status)
    プロセスが終了していないが、停止していて再開できる場合に真となります。 このマクロは wait 呼び出しで WUNTRACED オプションを指定するか、子プロセスがトレースされている (ptrace(2) を参照) 場合のみに真となります。

上記マクロの値に従って、以下のマクロは、 子プロセスの残りのステータス情報を生成します:

WEXITSTATUS(status)
    WIFEXITED(status) が真である場合に、子が _exit(2) か exit(3) に渡した引数の下位 8 ビットを評価します。

WTERMSIG(status)
    WIFSIGNALED(status) が真である場合に、プロセスの終了の原因となったシグナルの番号を評価します。

WCOREDUMP(status)
    WIFSIGNALED(status) が真である場合に、プロセスが終了した後で、シグナルを受信したときの プロセスのイメージを含むコアファイルが作成された場合に真となります。

WSTOPSIG(status)
    WIFSTOPPED(status) が真である場合に、プロセスの停止の原因となったシグナルの番号を評価します。

注
終了シグナルのリストについては、 sigaction(2) を参照してください。 ステータスが 0 であるということは、正常に終了したということです。

すべての子プロセスの終了を待たずに親プロセスが終了すると、 残りの子プロセスには親プロセス ID に 1 (init のプロセス ID) が 割り当てられます。

任意の wait() 呼び出しが保留になっている間にシグナルを受信すると、 シグナル受信ルーチンが戻ったときに、 呼び出しは割り込まれるか再開されます。 これはシグナルに影響するオプションに依存します。 intro(2) システムコールの再開 (System call restart) の項目を参照してください。

戻り値
子プロセスが停止したか終了したために wait() が戻った場合は、子のプロセス ID が呼び出し側プロセスに戻されます。 その他の場合は -1 が戻され、 errno がエラーを示すように設定されます。

子プロセスが停止したか終了したために wait4(), wait3(), waitpid() が戻った場合は、子のプロセス ID が呼び出し側プロセスに戻されます。 まだ wait されていない子プロセスが存在しない場合は、-1 が戻されて errno が ECHILD に設定されます。 WNOHANG が指定され、停止した子または終了した子がない場合は 0 が戻されます。 エラーが検出されるか、受信シグナルによりこの呼び出しが異常終了した場合は、 -1 が戻され、 errno がエラーを示すように設定されます。

エラー
wait() 関数は以下の場合にエラーとなり、ただちに戻ります:

[ECHILD]
    呼び出し側プロセスは、wait されていない子プロセスを持ちません。

[ECHILD]
    シグナル SIGCHLD を無視すること、またはこのシグナルに SA_NOCLDWAIT フラグを設定することにより、呼び出し側のプロセスは既にシステムに このような戻り値を廃棄するように要求しているので、 終了された子プロセスからの戻り値が無いことが可能です。

[EFAULT]
    status 引数か rusage 引数が違法なアドレスを指しています。 (子プロセスの終了前には検出されないことがあります。)

[EINTR]
    呼び出しが受信シグナルによって割り込まれたか、シグナルに SA_RESTART フラグが設定されていません。

規格
wait() 関数と waitpid() 関数は POSIX によって定義されています。 wait4() と wait3() は POSIX の仕様ではありません。 WCOREDUMP() マクロおよび保留中の wait() 呼び出しを再開する機能は POSIX インタフェースの拡張機能です。

関連項目
_exit(2), ptrace(2), sigaction(2), exit(3)

歴史
wait() 関数は、 AT&T UNIX で登場しました。