waitpid() - 特定の子プロセス終了の待機

標準

標準/拡張機能 C/C++ 依存項目

POSIX.1
XPG4
XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

#define _POSIX_SOURCE
#include <sys/wait.h>

pid_t waitpid(pid_t pid, int *status_ptr, int options);

機能説明

子プロセスが終了するか、停止するまで呼び出しプロセスを 中断します。正確には、waitpid() はシステムが終了した子に関する 状況情報を取得するまで呼び出しプロセスを中断します。waitpid() を呼び出したときに、適切な子プロセスに関する状況情報 が既にシステムにある場合には、waitpid() は即時に戻ります。アクションがシグナル・ハンドラーを実行するか、プロセスを終了する ためのものであるシグナルを呼び出しプロセスが受信した場合にも、waitpid() は終了します。
pid_t pid
呼び出し元が待機する必要がある子プロセスを指定します。
  • pid が 0 より大きい場合には、waitpid() は、プロセス ID が pid に等しい、特定の子の終了を待機します。
  • pid がゼロに等しい場合には、waitpid() は プロセス・グループ ID が呼び出し元のそれに等しい子の終了を 待機します。
  • pid が -1 の場合には、waitpid() は子プロセスの 終了を待機します。
  • pid が -1 より小さい場合には、waitpid() は プロセス・グループ ID が pid の絶対値に等しい子の 終了を待機します。
int *status_ptr
waitpid() が状況値を保管できる場所を指します。子プロセスが明示的にゼロ状況を戻すと、この状況値はゼロになります。そうでない場合には、これは、以下の「状況分析マクロ」で 説明されている状況分析マクロを使用して分析できる値です。

status_ptr ポインターも NULL である可能性が あります。この場合に waitpid() は子の戻り状況を無視します。

int options
waitpid() の追加情報を指定します。options 値は、sys/wait.h ヘッダー・ファイルに定義 されている次のフラグのゼロまたはそれ以上のビット単位の 包含 OR から構成されています。
WCONTINUED
XPG4.2 の特殊な動作: 終了した子プロセスの他に、継続された子プロセスの状況を報告します。WIFCONTINUED マクロによって、プロセスは 継続プロセスと終了プロセスを区別できます。
WNOHANG
即時に状況情報を要求します。状況情報が適切な子プロセスで 即時に使用可能になった場合には、waitpid() はこの情報を 戻します。そうでない場合には、waitpid() は情報が使用でき なかったことを示すエラー・コードと一緒に即時に戻ります。すなわち、WNOHANG は呼び出し元を中断することなく子プロセスをチェック します。
WUNTRACED
終了した子プロセスの他に停止した子プロセスについて 報告します。WIFSTOPPED マクロによって、プロセスは 停止プロセスと終了プロセスを区別できます。

XPG4.2 の特殊な動作: 呼び出しプロセスに SIG_IGN に設定された SA_NOCLDWAIT または SIGCHLD があって、そのプロセスにゾンビ・プロセスに変形された非待機の子がない場合には、このプロセスはすべての子が 終了するまでブロックし、waitpid() は失敗し、errno を ECHILD に設定します。

状況分析マクロ: status_ptr 引数が NULL でない場合には、waitpid() は 子の戻り状況を *status_ptr に入れます。 sys/wait.h ヘッダー・ファイルに定義された、次のマクロを 使用してこの戻り状況を分析できます。
WEXITSTATUS(*status_ptr)
WIFEXITED() がゼロ以外の場合には、WEXITSTATUS() は子が exit() 関数または _exit() 関数に渡した状況引数の下位 8 ビット、あるいは子プロセスが main() から戻した値に対して評価します。
WIFCONTINUED(*status_ptr)
XPG4.2 の特殊な動作: 子プロセスがジョブ制御停止から継続している場合には、このマクロは、ゼロ以外の (真の) 値に対して評価します。オプションをもつ waitpid() の後ろにだけこれを使用する ようにしてください。
WIFEXITED(*status_ptr)
子プロセスが正常に終了した場合 (すなわち、これが main() から戻されたか、あるいは exit() 関数 または _exit() 関数を呼び出した場合) には、このマクロはゼロ以外の (真の) 値に対して評価します。
WIFSIGNALED(*status_ptr)
シグナルがキャッチされなかったので、子プロセスが終了した場合に は、このマクロはゼロ以外の (真の) 値に対して評価します。
WIFSTOPPED(*status_ptr)
子プロセスが現在停止している場合には、このマクロはゼロ以外の (真の) 値に対して評価します。WUNTRACED オプションをもつ waitpid() の後ろにだけこれを使用する ようにしてください。
WSTOPSIG(*status_ptr)
WIFSTOPPED() がゼロ以外のときには、WSTOPSIG() は子を停止した シグナル数に対して評価します。
WTERMSIG(*status_ptr)
WIFSIGNALED() がゼロ以外のときには、WTERMSIG() は子プロセス を終了したシグナル数に対して評価します。

戻り値

正常に実行された場合、waitpid() は、状況情報が取得された プロセス (通常は子) の値を戻します。

WNOHANG が指定され、状況情報が使用できないプロセス (通常は子) が少なくとも 1 つある場合には、waitpid() は 0 を戻します。

正常に実行されなかった場合、waitpid() は -1 を戻して、errno を次のいずれかの値に設定します。
エラー・コード
説明
ECHILD
pid によって指定されたプロセスが存在しないか、それが呼び出しプロセスの子でないか、あるいは pid に よって指定されたプロセス・グループが存在しないか、そのグループ に呼び出しプロセスの子であるメンバー・プロセスがありません。
EINTR
waitpid() にシグナルが割り込みました。*status_ptr の値は定義されていません。
EINVAL
options の値は正しくありません。

CELEBW02
⁄* CELEBW02

   The following function suspends the calling process using &waitpid.
   until a child process ends.

 *⁄
#define _POSIX_SOURCE
#include <sys⁄types.h>
#include <sys⁄wait.h>
#include <unistd.h>
#include <stdio.h>
#include <time.h>

main() {
  pid_t pid;
  time_t t;
  int status;

  if ((pid = fork()) < 0)
    perror("fork() error");
  else if (pid == 0) {
    sleep(5);
    exit(1);
  }
  else do {
    if ((pid = waitpid(pid, &status, WNOHANG)) == -1)
      perror("wait() error");
    else if (pid == 0) {
      time(&t);
      printf("child is still running at %s", ctime(&t));
      sleep(1);
    }
    else {
      if (WIFEXITED(status))
        printf("child exited with status of %d¥n", WEXITSTATUS(status));
      else puts("child did not exit successfully");
    }
  } while (pid == 0);
}
出力:
child is still running at Fri Jun 16 11:05:43 2006
child is still running at Fri Jun 16 11:05:44 2006
child is still running at Fri Jun 16 11:05:45 2006
child is still running at Fri Jun 16 11:05:46 2006
child is still running at Fri Jun 16 11:05:47 2006
child is still running at Fri Jun 16 11:05:48 2006
child is still running at Fri Jun 16 11:05:49 2006
child exited with status of 1

関連情報