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 パラメータには、以下の任意のオプションのビット論理和が入ります。 WNOHANG オプションは、ステータスを報告するプロセスがない場合に呼出しがブロック しないことを示すために使用します。 WUNTRACED オプションを設定すると、SIGTTIN シグナル、SIGTTOU シグナル、SIGTSTP シグナル、 SIGSTOP シグナルのために停止したカレントプロセスの子にも、 そのステータスを報告させます。 rusage が 0 以外である場合は、終了したプロセスと そのすべての子が使用したリソースのサマリが返されます (現在のところ、この情報は停止したプロセスについては使用できません)。 WNOHANG オプションを指定が指定され、ステータスを報告するプロセスがない場合、 wait4() はプロセス ID 0 を戻します。

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

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

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 であるということは、正常に終了したということです。

すべての子プロセスの終了を待たずに親プロセスが終了すると、 残りの子プロセスには親プロセス 1 ID (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 されていない子プロセスを持ちません。

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

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

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

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

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