EN JA
WAIT(2)
WAIT(2) FreeBSD System Calls Manual WAIT(2)

名称

wait, waitid, waitpid, wait3, wait4, wait6状態を変更するプロセスを待つ

ライブラリ

Standard C Library (libc, -lc)

書式

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

pid_t
wait( int *status);

pid_t
waitpid( pid_t wpid, int *status, int options);

#include < sys/signal.h>

int
waitid( idtype_t idtype, id_t id, siginfo_t *info, int options);

#include < sys/time.h>
#include < sys/resource.h>

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

pid_t
wait4( pid_t wpid, int *status, int options, struct rusage *rusage);

pid_t
wait6( idtype_t idtype, id_t id, int *status, int options, struct __wrusage *wrusage, siginfo_t *infop);

解説

wait() 関数は、終了した子プロセスの status 情報が使用できるようになるまで、またはシグナルを受信するまで、呼び出しプロセスの実行を停止します。 wait() 呼び出しが成功すると、 status 領域には、下の定義のように終了したプロセスの終了情報が入ります。 wait() 呼び出しは、-1 の wpid 値、0 の options 値と 0 の rusage 値で、 wait4() を呼び出すのと同じです。

wait4() システムコールは、特定の子プロセスを待つ必要があり、子プロセスが蓄積したリソース利用統計あるいはオプションを必要とするプログラムのために、より一般的なインタフェースを提供します。

このすべての関数ファミリの幅広いインタフェースは、少数の非常に重要な違いがありますが、 wait4() にたいへん似ている、 wait6() です。終了されたプロセスを待つためには、オプションフラグ WEXITED を明示的に指定する必要があります。これは、終了したプロセスから終了ステータスを扱う必要なしに、他のステータスの変更が起こったプロセスを待つことを考慮に入れます。古い rusage 引数の代わりに、新しい構造体

struct __wrusage { 
 struct rusage   wru_self; 
 struct rusage   wru_children; 
};

へのポインタを渡すことができます。これによって、呼び出されているプロセスは、主要な子プロセスからと同様に、それ自体の子プロセスからリソース使用量の統計を集めることができます。リソース使用量の統計が必要でないとき、このポインタは、 NULL を指定します。最後の引数 infop は、 NULL または siginfo_t 構造体へのポインタのいずれかでなければなりません。指定されたとき、構造体は、プロセスの状態変更で配信され、 SIGNCHLD シグナルと同じように書き込まれます。

 

状態が問合わされたプロセスは、2 の引数 idtypeid によって指定されます。個別の idtypeid 引数によって、PID と PGID に加えて、同様に他の多くのタイプの ID をサポートすることができます。

  • idtypeP_PID であるなら、 waitid() と wait6() は、 (pid_t)id と等しいプロセス ID がある子プロセスを待ちます。
  • idtypeP_PGID であるなら、 waitid() と wait6() は、 (pid_t)id と等しいプロセスグループ ID がある子プロセスを待ちます。
  • idtypeP_ALL であるなら、 waitid() と wait6() は、あらゆる子プロセスを待ち、 id は、が無視されます。
  • idtypeP_PID または P_PGIDid がであるなら、 waitid() と wait6() は、呼び出し側と同じプロセスグループのあらゆる子プロセスを待ちます。

waitid() と wait6() の、この実装によってサポートされている、待っているプロセスのための非標準の指定子は、次の通りです:

  • idtypeP_UID は、有効な UID が (uid_t)id と等しいプロセスを待ちます。
  • idtypeP_GID は、有効な GID が (gid_t)id と等しいプロセスを待ちます。
  • idtypeP_SID は、セッション ID が id と等しいプロセスを待ちます。それ自体の新しいセッションを始めた子プロセスの場合、SID は、それ自体の PID と同じとなります。そうでなければ、子プロセスの SID は、呼び出し側の SID と一致します。
  • idtypeP_JAILID は、jail 識別子が id と等しい jail 内のプロセスを待ちます。

wait(), wait3() と wait4() について、単一の wpid 引数は、待っている子プロセスの集合を指定します。

  • wpid が -1 である場合、この呼び出しは、すべての子プロセスを待ちます。
  • wpid が 0 である場合、この呼び出しは、呼び出し側のプロセスグループのすべての子プロセスを待ちます。
  • wpid が 0 より大きい場合、この呼び出しは、プロセス ID が wpid であるプロセスを待ちます。
  • wpid が -1 より小さい場合、呼び出しは、プロセスグループ ID が wpid の絶対値に等しいプロセスを待ちます。

status 引数は、以下のように定義されています。

options 引数には、以下の任意のオプションのビット論理和が入ります。

WCONTINUED
は、 SIGCONT シグナルを受け取ることによって、ジョブ制御の停止から継続している現在のプロセスの子プロセスが、それらのステータスも報告するべきであることを示します。
WNOHANG
は、ステータスを報告するプロセスがないとき、呼び出しがブロックするべきでないことを示すために使用されます。
WUNTRACED
は、 SIGTTIN, SIGTTOU, SIGTSTP または SIGSTOP シグナルのために停止される現在のプロセスの子プロセスがそれらのステータスを報告するべきであることを示します。
WSTOPPED
は、 WUNTRACED のための別名です。
WTRAPPED
は、ブレークポイントをトラップするか、または到達してたプロセスを待つことを可能にします。
WEXITED
呼び出し側が終了したプロセスからステータス報告を受け取りたいことを示します。このフラグは、関数 wait(), waitpid(), wait3() と wait4() のために暗黙のうちに設定されます。
 
waitid() と wait6() 関数について、終了したプロセスからの状態報告が期待されるなら、明示的に options にフラグを含んでいなければなりません。
WNOWAIT
は、状態が待つことが可能な状態で返されるプロセスを保持します。プロセスは、この呼び出しが完了した後に、再び待たれるかもしれません。
 

waitid() と wait6() 関数について、オプション WEXITED, WUNTRACED, WSTOPPED, WTRAPPED または WCONTINUED の少なくとも 1 つは、指定されなければなりません。そうでなければ、報告する呼び出しのためのイベントは、ありません。このような場合に、無期限にハングアップすることを防ぐために、これらの関数は、 errnoEINVAL を設定して -1 を返します。

rusage が NULL でないなら、終了したプロセスとそのすべての子プロセスによって使用されるリソースの要約が返されます。

wrusage 引数が NULL でないなら、その主要な子プロセスと同様に、それ自体の子プロセスからリソース使用量の統計が返されます。

infop NULL でないなら、 si_signo フィールドが常に SIGCHLD であり、報告する状態変更があるなら、フィールド si_pid が 0 でないような返り時に書き込まれる siginfo_t 構造体を指さなければなりません。報告する状態変更がなく、WNOHANG が適用されるなら、これらのフィールドの両方とも 0 が返されます。 WNOHANG オプション設定がある waitid() 関数を使用するとき、実際は、 waitid() からの成功した返りである、 waitid() からの返り値が 0 となるので、これらのフィールドのチェックは、報告するあらゆる状態の変更があったかどうか知るただ 1 つの方法です。

WNOHANG オプションが指定され、ステータスを報告するプロセスがない場合、 wait4() は、プロセス ID 0 を戻します。

waitpid() 関数は、 rusage の値を 0 にした wait4() と同じです。古い wait3() 呼び出しは、 wpid の値を -1 にした wait4() と同じです。 options のビット WEXITEDWTRAPPED が設定され、 infopNULL である wait6() 呼び出しは、 wait4() に似ています。

以下のマクロは、プロセスの終了の仕方を知るのに使用できます。最初の 4 つのマクロは、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() 呼び出しが保留中 (pending) である間にシグナルを受信すると、シグナル受信ルーチンが戻ったときに、呼び出しは、割り込まれるか再開されます。これは、シグナルに影響するオプションに依存します。 sigaction(2)SA_RESTART の議論を参照してください。

この実装は、子プロセスの状態が利用可能であるので、 wait() が戻るなら、状態が変化した各子プロセスのために 1 つの SIGCHLD シグナルをキューに入れます、子プロセスのプロセス ID に関連している保留中の SIGCHLD シグナルは、破棄されます。その他の保留中の SIGCHLD シグナルは、保留中のままです。

SIGCHLD がブロックされるら、子プロセスの状態が利用可能であるので、 wait() は、戻って、子プロセスの別の状態が利用可能でないなら、保留中の SIGCHLD シグナルは、クリアされます。

戻り値

子プロセスが停止した、継続した、または終了したために wait() が戻った場合は、子のプロセス ID が呼び出し側プロセスに戻されます。そうでなければ、-1 が返えされ、 errno がエラーを示すように設定されます。

wait6(), wait4(), wait3() または waitpid() が停止した、継続した、または終了した子プロセスのために返るなら、子どものプロセス ID は、呼び出しているプロセスに返されます。以前に待たれていない子どもがないなら、 errnoECHILD に設定され -1 が返されます。そうでなければ、 WNOHANG が指定され、停止した、継続した、または終了した子どもがないなら、0 が返されます。エラーが検出されるか、または捕獲されたシグナルが呼び出しをアボートするなら、 -1 の値が返され、 errno は、エラーを示す値が設定されます。

waitid() が返るなら、1 つ以上のプロセスに報告する状態変更があるので、 0 が返されます。エラーを示すために、-1 が返され、 errno にエラーを示す適切な値が設定されます。 WNOHANG が使用されたなら、エラーがないことを示す 0 が返されますが、プロセスは、si_signo および si_pid のいずれかが 0 であるなら、状態を変更しません。

エラー

wait() 関数は、次の場合に失敗し、直ちに返ります:
[ ECHILD]
呼び出し側プロセスは、wait されていない子プロセスを持ちません。
[ ECHILD]
シグナル SIGCHLD を無視すること、またはこのシグナルに SA_NOCLDWAIT フラグを設定することにより、呼び出し側のプロセスは、既にシステムにこのような戻り値を廃棄するように要求しているので、終了された子プロセスからの戻り値が無いことが可能です。
[ EFAULT]
status 引数か rusage 引数が違法なアドレスを指しています。 (子プロセスの終了前には、検出されないことがあります。)
[ EINTR]
呼び出しが受信シグナルによって割り込まれたか、シグナルに SA_RESTART フラグが設定されていません。
[ EINVAL]
不正な値が、 options に指定されたか、または idtypeid がプロセスの有効な設定を指定していません。

規格

wait(), waitpid() と waitid() 関数は、POSIX によって定義されています。 wait6(), wait4() と wait3() は、POSIX で仕様化されていません。 WCOREDUMP() マクロは、POSIX インタフェースの拡張です。

waitpid() がある WNOWAIT フラグを使用する能力は、拡張です。 POSIX は、単に waitid() がある、このフラグのみを許可します。

POSIX は、 _exit(2) に渡された完全な 32 ビットを返すために waitid() を要求します。この実装は、他の呼び出しのように、8 ビットのみを返します。

歴史

wait() 関数は、 Version 6 AT&T UNIX で登場しました。
September 7, 2013 FreeBSD