Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ wait(2) — NEWS-os 4.1C

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

exit(2)

getrusage(2)

sigvec(2)

siginterrupt(3)

signal(3)

WAIT(2)  —  NEWS-OS Programmer’s Manual

名称

wait, wait3, wait4, WIFSTOPPED, WIFSIGNALED, WIFEXITED − プロセスが終了または停止するのを待つ

形式

#include <sys/wait.h>

int wait(statusp)
union wait ∗statusp;

int wait((union wait ∗)0)

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

int wait3(statusp, options, rusage)
union wait ∗statusp;
int options;
struct rusage ∗rusage;

int wait4(pid, statusp, options, rusage)
int pid;
union wait ∗statusp;
int options;
struct rusage ∗rusage;

WIFSTOPPED(status)
union wait status;

WIFSIGNALED(status)
union wait status;

WIFEXITED(status)
union wait status;

解説

wait() は、シグナルを受信するか、または子プロセスがトレースによって終了 あるいは停止するまで、呼び出し元プロセスを遅延させます。 そのいずれかの子プロセスがトレース中に 死んだ、または停止し、このことが  wait を使用して報告されなければ、直ちにリターンし、 その終了している子プロセスのうちのどれかの プロセス  ID と終了ステータスを返します。 その子プロセスが死んでいる場合は、捨てられます。 子プロセスがない場合には −1 が返されます。 報告された子プロセス以外が稼動しているか、 または停止している場合、 呼び出しプロセスはブロックされます。 status が ナル ポインタでない場合は、 wait() 呼び出しが無事にリターンしたことを示し、 wait() のリターン値が示すプロセス  ID の子プロセスのステータスが、 status がさす  wait() ユニオンにストアされます。 このユニオンの  w_status メンバは  int です。 これは、終了の原因と、 終了したプロセスについてのその他の情報を次の形式で表します。

• w_status の下位8ビットが 0177 である場合は、 子プロセスが停止したことを表します。 ptrace(2) と sigvec(2) を参照してください。

• w_status の下位8ビットが0以外で、0177 でない場合は、子プロセスがシグナルにより 終了したことを表します。 w_status の下位7ビットには、プロセスを終了したシグナルの番号が含まれています。 さらに、 w_status の下位第7ビット(つまりビット 0200)が設定された場合には、 プロセスの “コアイメージ” が作成されたことを表します。 sigvec(2) を参照して下さい。

• それ以外の場合には、子プロセスが  exit() 呼び出しによって終了したことを表します。 w_status の下位8ビットより上位の8ビットには、子プロセスが  exit に渡した引数の下位8ビットが含まれています。 exit(2) を参照して下さい。

wait() ユニオンの他のメンバは、次のようにこの情報を都合よく抜き取るため 使用することができます。

• w_stopval メンバに WSTOPPED という値がある場合には、子プロセスが停止したことを表します。 w_stopsig メンバの値はこのプロセスを停止させたシグナルの番号です。

• w_termsig メンバがゼロ以外の場合には、子プロセスがシグナルによって終了したことを 表します。 w_termsig メンバの値はこのプロセスを終了させたシグナルの番号です。 w_coredump がゼロ以外の場合には、コアダンプが行われたことを表します。

• それ以外の場合には、子プロセスが  exit() 呼び出しにより終了したことを表します。 w_retcode の値は、子プロセスが  exit に渡した引数の下位8ビットです。

それ以外の  wait() ユニオンのメンバは、ステータスを解析するための代案となるにすぎません。 w_status フィールドにストアされた値は、 UNIX システムの他のバージョンでストアされた値と互換性があり、 int ∗ タイプの引数はこれらのバージョンとの互換性を確保するため union wait ∗ タイプの引数の代わりに与えられることがあります。 wait3() は、非ブロッキングステータスの収集および任意の手段によって停止された 子プロセスの収集を行えるようにする代替インターフェースです。 status パラメータは、上記のように定義されます。 options パラメータは、下記を示すため使用されます。 つまり、報告するステータスをもつプロセスがない場合に呼び出しがブロック すべきではない (WNOHANG) ことや、 SIGTTIN、 SIGTTOU、 SIGTSTP、 または SIGSTOP シグナルによって停止される現在のプロセスの子プロセスが同様にステータスを 報告させるべきである (WUNTRACED) ことを示すため使用されます。 終了した子プロセスは、ステータスを報告した後捨てられ、停止したプロセスは 2回以上ステータスを報告しません。 rusage が ナル ポインタでなければ、終了したプロセスとその子プロセスすべてが使用する リソースの要約が返されます。 (現時点では、停止したプロセスについてはこの情報は得られません。) WNOHANG オプションが指定され、どのプロセスも報告するステータスをもたない場合、 wait3() は0を返します。 WNOHANG および WUNTRACED オプションは2つの値の論理和をとることで組み合わせることができます。 wait4() はもう1つの代替インターフェースです。 pid 引数が0であれば、 wait4() は  wait3 と同じです。 pid が0以外であれば、 wait4() は他の子プロセスではなく指定されたプロセス  ID についてのみステータスを返します。 WIFSTOPPED、 WIFSIGNALED、 WIFEXITED は、 wait、 wait2、 wait3 または wait4 で返される ‘union wait’ タイプの引数 status をとるマクロです。 WIFSTOPPED は、 wait() 呼び出しの対象となったプロセスが停止された場合には真 (1) であり、その他の 場合には偽 (0) です。 WIFSIGNALED は、プロセスがシグナルにより終了した場合に真です。 WIFEXITED は、 exit(2) 呼び出しを使用することでプロセスが終了した場合に真です。

注意事項

親プロセスが子プロセスを待たずに終了すると、初期設定プロセス(プロセス ID = 1)は子プロセスに受け継がれます。 wait、 wait3 および wait4() は、 SV_INTERRUPT ビットがそのシグナルのフラグで設定されない限り、子プロセスの終了を 待っている間にプロセスがシグナルを受け取ったとき、自動的に再開されます。

リターン値

wait() が停止したかまたは終了した子プロセスによってリターンすると、 子プロセスのプロセス ID が呼び出しプロセスに返されます。 さもなければ、−1 が返され、エラーを表す  errno が設定されます。 wait3() および  wait4() は、 WNOHANG が指定され、停止または終了した子プロセスがない場合には0を返し、 子プロセスの停止または終了によってリターンする場合には子プロセスの プロセス ID を返します。 そうでない場合には、−1 を返し、エラーを表す  errno を設定します。

エラー

wait、 wait3 または  wait4 は、下記のどれかが当てはまる場合には失敗し、直ちにリターンします。

ECHILD 呼び出しプロセスは、存在している待たれていない子プロセスを持っていない。

EFAULT status または  rusage 引数が不正なアドレスを指す。 wait、 wait3 および  wait4 は、フラグフィールドの SV_INTERRUPT ビットを指定するシグナルを受け取ると、早期に終了し、−1 を返し、 errno を EINTR に設定します。 ( sigvec(2) と siginterrupt(3) を参照して下さい。)

関連事項

exit(2), getrusage(2), sigvec(2), siginterrupt(3), signal(3)

警告

引数 0 による  wait の呼び出しは、以下のように、タイプ ‘unionwait∗’ にキャストされなければなりません。

wait( (union wait ∗) 0) そうでない場合には、 lint(1) がメッセージを送ります。

NEWS-OSRelease 4.1C

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026