スポンサーリンク

WAIT(2) FreeBSD システムコールマニュアル WAIT(2)

名称

wait, waitpid, wait4, wait3 − プロセスの終了待機

ライブラリ

標準 C ライブラリ (libc, −lc)

書式

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

pid_t

wait(int *status);

#include <sys/time.h>

#include <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() 関数は、 Version 6 AT&T UNIX で登場しました。

FreeBSD 10.0 April 19, 1994 FreeBSD 10.0

スポンサーリンク