WAIT(2) FreeBSD システムコールマニュアル WAIT(2)
名称
wait, waitpid, wait4, wait3 − プロセスの終了待機 |
ライブラリ
標準 C ライブラリ (libc, −lc) |
書式
#include <sys/types.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) WIFSIGNALED(status) WIFSTOPPED(status) 上記マクロの値に従って、以下のマクロは、子プロセスの残りのステータス情報 を生成します: WEXITSTATUS(status) WTERMSIG(status) WCOREDUMP(status) WSTOPSIG(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] [EFAULT] [EINTR] 規格 |
wait() 関数と waitpid() 関数は POSIX によって定義されています。 wait4() と wait3() は POSIX の仕様ではありません。 WCOREDUMP() マクロおよび保留中 の wait() 呼び出しを再開する機能は POSIX インタフェースの拡張機能です。 |
関連項目
歴史
wait() 関数は、 Version 6 AT&T UNIX で登場しました。 FreeBSD 10.0 April 19, 1994 FreeBSD 10.0 |