WAIT4(2)

名前
wait3, wait4 - プロセス(process)の終了を待つ, BSD スタイル

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

pid_t wait3(int *status, int options,
      struct rusage *rusage)

pid_t wait4(pid_t pid, int *status, int options,
      struct rusage *rusage)

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

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

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

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

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

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

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

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

もし status が NULL でないならば、 wait3 または wait4 は status で指定された場所に状態(status)情報を格納する。

この状態は以下のマクロを使って評価できる(これらのマクロは引き数として、 — 状態バッファーへのポインター em ではなく状態バッファー(int) をとる:

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

WEXITSTATUS(status)
    は終了した子プロセスの返り値(return code)の重要な最下位8ビットを評価する、 これは exit() 呼び出しの引き数か main 関数で実行された return 文の引き数に設定されいるはずである。このマクロは WIFEXITED がゼロでない場合だけ評価できる。

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

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

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

WSTOPSIG(status)
    は子供を停止させたシグナルの番号を返す。このマクロは WIFSTOPPED がゼロ以外の場合のみ評価できる。 もし rusage が NULL でないならば、 struct rusage は <sys/resource.h> で定義されるアカウント(account)情報を指している。詳しくは getrusage(2) を参照すること。

返り値
終了した子供のプロセス ID を返す。エラーの場合は(特に、 指定した種類の待つべき子プロセスが存在しない場合には) -1 を返す。 WNOHANG が使用されていて適切な子供が存在しない場合には 0 を返す。 後の二つの場合には errno が適切に設定される。

エラー

ECHILD
    指定した種類の待つべき子プロセスが存在しない。

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

準拠
SVr4, POSIX.1

関連項目
signal(2), getrusage(2), wait(2), signal(7)