WAIT(2)

名前
wait, waitpid - プロセス(process)の終了を待つ

書式
#include <sys/types.h>
#include <sys/wait.h>

pid_t wait(int *status)
pid_t waitpid(pid_t pid, int *status, int options);

説明
wait 関数は子供が終了(exit)する、あるいは現在のプロセスがシグナルを受け とって終了するかシグナル処理関数(signal handling function)が呼び出さ れるまで現在のプロセスの実行を停止(suspend)する。もし呼び出した時 に既に子プロセスが終了していた("ゾンビ(zombie)"プロセスと呼ばれる)場合 にはこの関数はすぐに終了する。子プロセスによって使用されていた システムの資源は全て解放される。 waitpid 関数は引き数 pid で指定された子供が終了する、あるいは現在のプロセスがシグナルを受け とって終了するかシグナル処理関数が呼び出されるまで現在のプロセスの 実行を停止する。もし呼び出された時に既に pid で指定された子プロセスが終了していた(ゾンビ・プロセスと呼ばれる)場合 にはこの関数はすぐに終了する。子プロセスによって使用されていたシステ ムの資源は全て解放される。 pid の値は以下のどれか:

< -1
    これは プロセス・グループ(process group)ID の絶対値が pid に等しい子プロセスがどれか終了するまでを待つことを意味する。

-1  これは子プロセスのどれかが終了するまで待つことを意味する; これは wait の呼び出しと等価である。

0   これはプロセス・グループID が呼び出したプロセスと等価な子プロセスを待つ ことを意味する。

> 0 これはプロセスID が pid に等しい子プロセスを待つことを意味する。

options の値は以下の内容のゼロ個以上のビットORである:

WNOHANG
    これはもし待つべき子プロセスが存在しない場合にはすぐに返ることを意味する。

WUNTRACED
    これは子供が停止(stop)していた場合にも返ることを意味する。 状態(status)は報告されない。

もし status が NULL でないならば、 wait または waitpid は status で指定された場所に状態(status)情報を格納する。 この状態は以下のマクロ(macro)を使って評価できる(これらのマクロは引き数と して — 状態バッファーへのポインターでなく — 状態バッファー (int) を取る):

WIFEXITED(status)
    はもし子供が通常に終了した場合にはゼロ以外である。

WEXITSTATUS(status)
    は終了した子プロセスの exit 呼び出しの引き数か main 関数で実行された return 文の引き数に設定される。このマクロは WIFEXITED がゼロでない場合だけ評価できる。

WIFSIGNALED(status)
    は子プロセスが捕獲(catch)していないシグナルによって終了した場合に真(true) を返す。

WTERMSIG(status)
    は子プロセスを終了させたシグナルの番号を返す。このマクロは WIFSIGNALED がゼロ以外の場合のみ評価できる。

WIFSTOPPED(status)
    はもし返ってくる理由となった子プロセスが現在停止(stop)していた 場合に真を返す。これは WUNTRACED を使用した場合にのみおこりえる。

WSTOPSIG(status)
    は子供を停止させたシグナルの番号を返す。このマクロは WIFSTOPPED がゼロ以外の場合のみ評価できる。

返り値
終了した子供のプロセス ID が返される、エラーの場合は -1 が、 WNOHANG が使用されていて適切な子供が存在しない場合には 0 が返される。 (これらの場合には errno が適切に設定される。)

エラー

ECHILD
    pid で指定したプロセスが存在しないか、呼び出したプロセスの子プロセスでない。 (SIGCHLD に SIG_IGN を設定した場合には自分自信の子供でもこうなる。)

EINVAL
    options 引き数が不正である。

ERESTARTSYS
    WNOHANG が設定されていなくて禁止(block)されていないシグナルや SIGCHLD を受けた。このエラーはシステム・コールから返される。 ライブラリー・インターフェースは ERESTARTSYS を返すことを許していない、かわりに EINTR が返される。

注意
Single Unix Specification には(Linux には存在しない) SA_NOCLDWAIT フラグ についての記述がある。このフラグが設定されているか、SIGCHLD の動作として SIG_IGN が設定された(一方でこれは POSIX では許されていない)場合には 終了した子プロセスはゾンビ(zombie)になることなく、 wait() や waitpid() を呼び出すと子プロセスが終了するまで停止(block)される。そして errno に ECHILD が設定されて失敗する。

準拠
SVr4, POSIX.1

関連項目
signal(2), wait4(2), signal(7)