名 前
wait, waitpid, waitid − プ ロ セ ス の 状 態 変 化 を 待 つ
書 式
#include
<sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
int
waitid(idtype_t idtype, id_t id,
siginfo_t *infop, int
options);
/* こ れ は glibc と POSIX の
イ ン タ ー フ ェ
イ ス で あ る 。
生 の シ ス テ ム
コ ー ル に つ い
て の 情 報 は 「
注 意 」 の 節 を
参 照 。 */
glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):
waitid():
_SVID_SOURCE ||
_XOPEN_SOURCE >= 500 ||
_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
|| /* glibc 2.12 以 降 : */
_POSIX_C_SOURCE >= 200809L
説 明
こ れ ら の シ ス テ ム コ ー ル は い ず れ も 、 呼 び 出 し 元 プ ロ セ ス の 子 プ ロ セ ス の 状 態 変 化 を 待 ち 、 状 態 が 変 化 し た そ の 子 プ ロ セ ス の 情 報 を 取 得 す る の に 使 用 さ れ る 。 状 態 変 化 と は 以 下 の い ず れ か で あ る : 子 プ ロ セ ス の 終 了 、 シ グ ナ ル に よ る 子 プ ロ セ ス の 停 止 、 シ グ ナ ル に よ る 子 プ ロ セ ス の 再 開 。 子 プ ロ セ ス が 終 了 し た 場 合 は 、 wait を 実 行 す る こ と で 、 シ ス テ ム が そ の 子 プ ロ セ ス に 関 連 す る リ ソ ー ス を 解 放 で き る よ う に な る 。 wait が 実 行 さ れ な か っ た 場 合 に は 、 終 了 し た 子 プ ロ セ ス は 「 ゾ ン ビ 」 状 態 で 残 り 続 け る (下 記 の 注 意 の 章 を 参 照 の こ と )。 子 プ ロ セ ス の 状 態 変 化 が す で に 発 生 し て い た 場 合 、 こ れ ら の コ ー ル は す ぐ に 復 帰 す る 。 そ れ 以 外 の 場 合 は 、 子 プ ロ セ ス の 状 態 変 化 が 起 こ る か 、 シ グ ナ ル ハ ン ド ラ ー に よ り シ ス テ ム コ ー ル が 中 断 さ れ る ま で 、 停 止 (block) す る (後 者 は 、 sigaction(2) の SA_RESTART フ ラ グ に よ り シ ス テ ム コ ー ル が 自 動 的 に 再 ス タ ー ト す る よ う に な っ て い な い 場 合 の 動 作 で あ る )。 以 下 の 説 明 で は 、 状 態 変 化 が 起 こ っ た が こ れ ら の シ ス テ ム コ ー ル の い ず れ か に よ っ て 待 た れ て い な い 子 プ ロ セ ス を waitable (待 ち 可 能 ) と 呼 ぶ 。
wait()
と waitpid()
wait() シ ス テ ム コ
ー ル は 、 子 プ
ロ セ ス の い ず
れ か が 終 了 す
る ま で 呼 び 出
し 元 の プ ロ セ
ス の 実 行 を 一
時 停 止 す る 。
呼 び 出 し wait(&status)
は 以 下 と 等 価
で あ る :
waitpid(−1, &status, 0);
waitpid() シ ス テ ム コ ー ル は 、 pid 引 き 数 で 指 定 し た 子 プ ロ セ ス の 状 態 変 化 が 起 こ る ま で 、 呼 び 出 し 元 の プ ロ セ ス の 実 行 を 一 時 停 止 す る 。 デ フ ォ ル ト で は 、 waitpid() は 子 プ ロ セ ス の 終 了 だ け を 待 つ が 、 こ の 動 作 は options 引 き 数 に よ り 変 更 可 能 で あ る 。
pid に 指 定 で き る 値 は 以 下 の 通 り :
< −1 プ ロ セ ス グ ル ー プ |
ID が pid の 絶 対 値 に 等 し い 子 プ ロ セ ス の い ず れ か が |
終 了 す る ま で を 待 つ 。
−1 子 プ ロ セ ス の ど れ か が 終 了 す る ま で 待 つ 。 |
||
0 プ ロ セ ス グ ル ー プ |
ID が 呼 び 出 し た プ ロ セ ス の も の と 等 し い 子 プ ロ セ ス を 待 つ 。
> 0 プ ロ セ ス |
ID が pid に 等 し い 子 プ ロ セ ス を 待 つ 。 |
options の 値 は 次 の 定 数 の 0 個 以 上 の 論 理 和 で あ る :
WNOHANG 状 態 変 化 が 起 こ っ た 子 プ ロ セ ス が な い 場 合 に す ぐ に 復 帰 す る 。 | |
WUNTRACED 子 プ ロ セ ス が 停 止 し た 場 合 に も 復 帰 す る |
(子 プ ロ
セ ス が ptrace(2) で
ト レ ー ス さ れ
て い る 場 合 は
除 く )。 こ の オ
プ シ ョ ン が 指
定 さ れ て い な
い 場 合 で も 、
停 止 し た プ ロ
セ ス が 「 ト レ
ー ス (traced)」 さ れ
て い れ ば 、 子
プ ロ セ ス の 状
態 が 報 告 さ れ
る 。
WCONTINUED (Linux 2.6.10 以 降 ) 停
止 し た 子 プ ロ
セ ス が SIGCONT の 配
送 に よ り 再 開
し た 場 合 に も
復 帰 す る 。
(Linux 専 用 オ プ シ ョ ン に つ い て は 後 述 す る )
status
が NULL で な け れ ば
、 wait() や waitpid() は
status で 指 す int に
状 態 情 報 を 格
納 す る 。 こ の
整 数 は 以 下 の
マ ク ロ を 使 っ
て 検 査 で き る
。 (こ れ ら の マ
ク ロ の 引 き 数
に は 、 wait() や
waitpid() が 書 き 込
ん だ 整 数 そ の
も の を 指 定 す
る 。 ポ イ ン タ
ー で は な い !)
WIFEXITED(status) 子 プ
ロ セ ス が 正 常
に 終 了 し た 場
合 に 真 を 返 す
。 「 正 常 に 」
と は 、 exit(3) か
_exit(2) が 呼 び 出 さ
れ た 場 合 、 も
し く は main() か ら 復
帰 し た 場 合 で
あ る 。
WEXITSTATUS(status) 子 プ
ロ セ ス の 終 了
ス テ ー タ ス を
返 す 。 終 了 ス
テ ー タ ス は status
引 き 数 の 下 位
8ビ ッ ト で 構 成
さ れ て お り 、
exit(3) や _exit(2) の 呼
び 出 し 時 に 渡
さ れ た 値 、 も
し く は main() の return 文
の 引 き 数 と し
て 指 定 さ れ た
値 で あ る 。 こ
の マ ク ロ を 使
用 す る の は
WIFEXITED が 真 を 返
し た 場 合 だ け
に す べ き で あ
る 。
WIFSIGNALED(status) 子 プ
ロ セ ス が シ グ
ナ ル に よ り 終
了 し た 場 合 に
真 を 返 す 。
WTERMSIG(status) 子 プ
ロ セ ス 終 了 の
原 因 と な っ た
シ グ ナ ル の 番
号 を 返 す 。 こ
の マ ク ロ を 使
用 す る の は
WIFSIGNALED が 真 を 返
し た 場 合 だ け
に す べ き で あ
る 。
WCOREDUMP(status) 子 プ
ロ セ ス が コ ア
ダ ン プ を 生 成
し た 場 合 に 真
を 返 す 。 こ の
マ ク ロ を 使 用
す る の は WIFSIGNALED
が 真 を 返 し た
場 合 だ け に す
べ き で あ る 。
こ の マ ク ロ は
POSIX.1−2001 で は 規 定
さ れ て お ら ず
、 (AIX, SunOS な ど の ) い
く つ か の UNIX の 実
装 で は 利 用 で
き な い 。 必 ず #ifdef
WCOREDUMP ... #endif で 括 っ て
使 用 す る こ と
。
WIFSTOPPED(status) 子 プ
ロ セ ス が シ グ
ナ ル の 配 送 に
よ り 停 止 し た
場 合 に 真 を 返
す 。 こ れ が 真
に な る の は 、
シ ス テ ム コ ー
ル が WUNTRACED を 指
定 し て 呼 び 出
さ れ た 場 合 か
、 子 プ ロ セ ス
が ト レ ー ス さ
れ て い る 場 合
(ptrace(2) 参 照 ) だ け
で あ る 。
WSTOPSIG(status) 子 プ
ロ セ ス を 停 止
さ せ た シ グ ナ
ル の 番 号 を 返
す 。 こ の マ ク
ロ を 使 用 す る
の は WIFSTOPPED が 0 以
外 を 返 し た 場
合 だ け に す べ
き で あ る 。
WIFCONTINUED(status)
(Linux 2.6.10 以 降 ) 子 プ ロ セ ス が SIGCONT の 配 送 に よ り 再 開 し た 場 合 に 真 を 返 す 。
waitid()
waitid() シ ス テ ム コ
ー ル (Linux 2.6.9 以 降 で
利 用 可 能 ) を 使
う と 、 子 プ ロ
セ ス の ど の 状
態 変 化 を 待 つ
か に つ い て よ
り 細 か な 制 御
が で き る 。 引
き 数 idtype と id で
ど の 子 プ ロ セ
ス を 待 つ か を
選 択 す る :
idtype == P_PID プ ロ セ
ス ID が id と 一 致
す る 子 プ ロ セ
ス を 待 つ 。
idtype == P_PGID プ ロ セ
ス グ ル ー プ ID が
id と 一 致 す る
子 プ ロ セ ス を
待 つ 。
idtype == P_ALL 子 プ ロ
セ ス 全 部 を 対
象 に 待 つ 。 id
は 無 視 さ れ る
。 子 プ ロ セ ス
の ど の 状 態 変
化 を 待 つ か は
以 下 の フ ラ グ
で 指 定 す る (options
に は 1個 以 上 の
フ ラ グ の 論 理
和 を と っ て 指
定 す る ):
WEXITED 子 プ ロ セ ス の 終 了 を 待 つ 。 | |
WSTOPPED 子 プ ロ セ ス が シ グ ナ ル の 配 送 に よ り 停 止 す る の を 待 つ 。 | |
WCONTINUED |
(停 止 し て い た ) 子 プ ロ セ ス が SIGCONT が 配 送 さ れ て 再 開 す る の を 待 つ 。 さ ら に 以 下 の フ ラ グ を 論 理 和 の 形 で options に 指 定 で き る :
WNOHANG |
waitpid() と 同 様 。 | ||
WNOWAIT |
waitable 状 態 の プ ロ セ ス を そ の ま ま に す る 。 こ の 後 で wait コ ー ル を 使 っ て 、 同 じ 子 プ ロ セ ス の 状 態 情 報 を も う 一 度 取 得 す る こ と が で き る 。 |
成 功 し た 場 合 に は 、 waitid() は infop が 指 す siginfo_t 構 造 体 の 以 下 の フ ィ ー ル ド を 設 定 す る :
si_pid 子 プ ロ セ ス の プ ロ セ ス |
ID。
ー ID (こ の フ ィ ー ル ド は 他 の ほ と ん ど の 実 装 で は 設 定 さ れ な い )。
常 に
SIGCHLD が 設 定 さ れ
る 。 _exit(2) (か exit(3)) に 指 定 さ れ た 子 プ ロ セ ス の 終 了 ス テ ー タ ス 、 も し く は 子 プ ロ セ ス の 終 了 、 停 止 、 再 開 の 原 因 と な っ た シ グ ナ ル が 設 定 さ れ る 。 こ の フ ィ ー ル ド を ど う 解 釈 す る か は 、 si_code フ ィ ー ル ド を 参 照 し て 決 め る こ と が で き る 。 以 下 の い ず れ か が 設 定 さ れ る : CLD_EXITED (子 プ ロ セ ス が _exit(2) を 呼 び 出 し た ); CLD_KILLED (シ グ ナ ル に よ り 子 プ ロ セ ス が kill さ れ た ); CLD_DUMPED (シ グ ナ ル に よ り 子 プ ロ セ ス が kill さ れ 、 コ ア ダ ン プ が 行 わ れ た ); CLD_STOPPED (シ グ ナ ル に よ り 子 プ ロ セ ス が 停 止 し た ); CLD_TRAPPED (ト レ ー ス さ れ て い た 子 プ ロ セ ス が ト ラ ッ プ を 受 信 し た ); CLD_CONTINUED (SIGCONT に よ り 子 プ ロ セ ス が 再 開 さ れ た )。 WNOHANG が options に 指 定 さ れ て い て 、 waitable 状 態 の 子 プ ロ セ ス が な か っ た 場 合 に は 、 waitid() は す ぐ に 0 を 返 す 。 こ の と き 、 infop が 指 す siginfo_t 構 造 体 の 内 容 は 不 定 で あ る 。 こ の 場 合 を waitable 状 態 の 子 プ ロ セ ス が あ っ た 場 合 と 区 別 す る に は 、 waitid() を 呼 び 出 す 前 に si_pid を 0 に し て お き 、 コ ー ル が 復 帰 し た 後 で こ の フ ィ ー ル ド が 0 以 外 の 値 か ど う か を チ ェ ッ ク す れ ば よ い 。 返 り 値wait(): 成 功 す る と 、 終 了 し た 子 プ ロ セ ス の プ ロ セ ス ID を 返 す 。 エ ラ ー の 場 合 −1 を 返 す 。 waitpid(): 成 功 す る と 、 状 態 が 変 化 し た 子 プ ロ セ ス の プ ロ セ ス ID を 返 す 。 WNOHANG が 指 定 さ れ て い て 、 pid で 指 示 さ れ た 子 プ ロ セ ス が 一 つ 以 上 存 在 す る が 、 ど の 子 プ ロ セ ス で も 状 態 変 化 が 起 こ っ て い な か っ た 場 合 は 、 0 を 返 す 。 エ ラ ー の 場 合 −1 を 返 す 。 waitid(): 成 功 す る と 0 を 返 す 。 WNOHANG が 指 定 さ れ て い て 、 pid で 指 示 さ れ た 子 プ ロ セ ス で 状 態 変 化 が 起 こ っ て い な か っ た 場 合 に も 0 を 返 す 。 エ ラ ー の 場 合 −1 を 返 す 。 エ ラ ー の 場 合 、 こ れ ら の シ ス テ ム コ ー ル は い ず れ も errno に 適 切 な 値 を 設 定 す る 。 エ ラ ー
準 拠SVr4, 4.3BSD, POSIX.1−2001. 注 意終 了 し た が 、 wait さ れ て い な い 子 プ ロ セ ス は 「 ゾ ン ビ 」 に な る 。 後 で 親 プ ロ セ ス が wait を 実 行 し て 子 プ ロ セ ス に つ い て の 情 報 を 取 得 で き る よ う に 、 カ ー ネ ル は ゾ ン ビ プ ロ セ ス に つ い て 最 小 限 の 情 報 (PID、 終 了 ス テ ー タ ス 、 リ ソ ー ス 使 用 状 況 ) を 保 持 す る 。 ゾ ン ビ プ ロ セ ス は 、 wait に よ っ て シ ス テ ム か ら 削 除 さ れ な い 限 り 、 カ ー ネ ル の プ ロ セ ス テ ー ブ ル の 1 エ ン ト リ ー を 消 費 す る 。 こ の プ ロ セ ス テ ー ブ ル が 一 杯 に な る と 、 新 た に プ ロ セ ス を 作 る こ と が で き な く な る 。 親 プ ロ セ ス が 終 了 す る と 、 そ の 親 プ ロ セ ス の 「 ゾ ン ビ 」 の 子 プ ロ セ ス は (も し あ れ ば ) init(1) の 養 子 と な る 。 init(1) は wait を 自 動 的 に 実 行 し 、 ゾ ン ビ を 削 除 す る 。 POSIX.1−2001 で は 以 下 の よ う に 規 定 さ れ て い る 。 SIGCHLD の 動 作 が SIG_IGN に 設 定 さ れ た か 、 SIGCHLD に 対 し て SA_NOCLDWAIT フ ラ グ が 設 定 さ れ た 場 合 (sigaction(2) 参 照 )、 終 了 し た 子 プ ロ セ ス は ゾ ン ビ に は な ら ず 、 wait() や waitpid() の 呼 び 出 し は 全 て の 子 プ ロ セ ス が 終 了 す る ま で 停 止 し 、 子 プ ロ セ ス が 全 部 終 了 し た 後 errno に ECHILD を 設 定 し て 失 敗 す る 。 (も と も と の POSIX 標 準 は SIGCHLD に SIG_IGN を 設 定 し た 場 合 の 振 る 舞 い を 未 規 定 の ま ま に し て い る 。 SIGCHLD の デ フ ォ ル ト の 動 作 が 「 無 視 」 で あ る に も か か わ ら ず 、 SIGCHLD の 動 作 と し て SIG_IGN を 明 示 的 に 設 定 し た 場 合 に は ゾ ン ビ プ ロ セ ス の 子 プ ロ セ ス の 扱 い が 異 な る 点 に 注 意 す る こ と 。 ) Linux 2.6 は こ の 仕 様 に 準 拠 し て い る 。 し か し 、 Linux 2.4 (と そ れ 以 前 の バ ー ジ ョ ン ) は そ う で は な い : SIGCHLD が 無 視 さ れ る 状 態 で wait() ま た は waitpid() が 呼 び 出 さ れ た 場 合 、 SIGCHLD が 無 視 さ れ て い な い か の よ う に 振 る 舞 う 。 つ ま り 、 呼 び 出 し に よ っ て 次 の 子 プ ロ セ ス の 終 了 ま で ブ ロ ッ ク さ れ 、 終 了 し た 子 プ ロ セ ス の PID と 状 態 が 返 さ れ る 。 Linux
で の 注 意 clone(2)
を 用 い て 作 ら
れ た 子 プ ロ セ
ス に は 、 以 下
の Linux 固 有 の options
が 使 用 で き る
。 "clone" な 子 プ ロ セ ス だ け を 待 つ 。 指 定 さ れ な か っ た 場 合 は 非 "clone" な 子 プ ロ セ ス だ け を 待 つ ("clone" な 子 プ ロ セ ス は 、 終 了 時 に 親 プ ロ セ ス へ 全 く シ グ ナ ル を 送 ら な い か 、 SIGCHLD 以 外 の シ グ ナ ル を 送 る )。 こ の オ プ シ ョ ン は __WALL も 指 定 さ れ た 場 合 は 無 視 さ れ る 。 __WALL (Linux 2.4 以 降 ) "clone" で あ る か な い か に 関 わ ら ず 、 全 て の 子 プ ロ セ ス を 待 つ 。 __WNOTHREAD (Linux 2.4 以 降 ) 同 じ ス レ ッ ド グ ル ー プ の 他 の ス レ ッ ド の 子 プ ロ セ ス は 待 た な い 。 Linux 2.4 よ り 前 で は デ フ ォ ル ト で あ っ た 。 C ラ イ ブ ラ リ と カ ー ネ ル ABI の 違 い 生 の waitid() シ ス テ ム コ ー ル は struct rusage * 型 の 第 5 引 数 を 取 る 。 こ の 引 数 が NULL 以 外 の 場 合 、 こ の 引 数 が 子 プ ロ セ ス の リ ソ ー ス 使 用 状 況 を 返 す の に 使 用 さ れ る 。 こ れ は wait4(2) と 同 じ 方 法 で あ る 。 詳 細 は getrusage(2) を 参 照 。 バ グPOSIX.1−2008 に よ る と 、 waitid() を 呼 び 出 す ア プ リ ケ ー シ ョ ン は 、 infop が siginfo_t 構 造 体 を 指 し て い る こ と (つ ま り infop が NULL で な い ポ イ ン タ ー で あ る こ と ) を 保 証 し な け れ ば な ら な い 。 Linux で は 、 infop が NULL の 場 合 、 waitid() は 成 功 し 、 wait し て い る 子 プ ロ セ ス の プ ロ セ ス ID を 返 す 。 ア プ リ ケ ー シ ョ ン は 、 こ の 食 い 違 っ た 、 非 標 準 で 、 不 必 要 な 機 能 に 依 存 し な い よ う に す べ き で あ る 。 例以 下 の プ ロ グ ラ ム は 、 fork(2) と waitpid() の 使 用 方 法 の 例 を 示 し て い る 。 こ の プ ロ グ ラ ム で は 子 プ ロ セ ス を 生 成 す る 。 コ マ ン ド ラ イ ン 引 き 数 が 指 定 さ れ な か っ た と き は 、 子 プ ロ セ ス は pause(2) を 使 っ て そ の 実 行 を 一 時 停 止 し 、 ユ ー ザ ー が そ の 子 プ ロ セ ス に シ グ ナ ル を 送 信 で き る よ う に す る 。 コ マ ン ド ラ イ ン 引 き 数 が 指 定 さ れ た 場 合 は 、 子 プ ロ セ ス は 直 ち に 終 了 し 、 コ マ ン ド ラ イ ン で 指 定 さ れ た 整 数 を 終 了 ス テ ー タ ス と し て 使 用 す る 。 親 プ ロ セ ス は 、 waitpid() を 使 っ て 子 プ ロ セ ス を 監 視 し 、 wait の ス テ ー タ ス 値 を 上 記 の W*() マ ク ロ を 使 っ て 解 析 す る と い う ル ー プ を 実 行 す る 。 以 下 の シ ェ ル の セ ッ シ ョ ン は こ の プ ロ グ ラ ム の 使 用 例 を 示 し た も の で あ る 。 $ ./a.out
& #include <sys/wait.h>
int cpid = fork();
if (cpid == 0)
{ /* Code executed by child */ if
(WIFEXITED(status)) { 関 連 項 目_exit(2), clone(2), fork(2), kill(2), ptrace(2), sigaction(2), signal(2), wait4(2), pthread_create(3), credentials(7), signal(7) こ の 文 書 に つ い てこ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。 |