Manpages

名 前

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 以 降 で 利 用 可 能 ) を 使 う と 、 子 プ ロ セ ス の ど の 状 態 変 化 を 待 つ か に つ い て よ り 細 か な 制 御 が で き る 。 引 き 数 idtypeid で ど の 子 プ ロ セ ス を 待 つ か を 選 択 す る :
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。

si_uid 子 プ ロ セ ス の 実 ユ ー ザ

ー ID (こ の フ ィ ー ル ド は 他 の ほ と ん ど の 実 装 で は 設 定 さ れ な い )。

si_signo

常 に SIGCHLD が 設 定 さ れ る 。
si_status

_exit(2) (か exit(3)) に 指 定 さ れ た 子 プ ロ セ ス の 終 了 ス テ ー タ ス 、 も し く は 子 プ ロ セ ス の 終 了 、 停 止 、 再 開 の 原 因 と な っ た シ グ ナ ル が 設 定 さ れ る 。 こ の フ ィ ー ル ド を ど う 解 釈 す る か は 、 si_code フ ィ ー ル ド を 参 照 し て 決 め る こ と が で き る 。

si_code

以 下 の い ず れ か が 設 定 さ れ る : CLD_EXITED (子 プ ロ セ ス が _exit(2) を 呼 び 出 し た ); CLD_KILLED (シ グ ナ ル に よ り 子 プ ロ セ ス が kill さ れ た ); CLD_DUMPED (シ グ ナ ル に よ り 子 プ ロ セ ス が kill さ れ 、 コ ア ダ ン プ が 行 わ れ た ); CLD_STOPPED (シ グ ナ ル に よ り 子 プ ロ セ ス が 停 止 し た ); CLD_TRAPPED (ト レ ー ス さ れ て い た 子 プ ロ セ ス が ト ラ ッ プ を 受 信 し た ); CLD_CONTINUED (SIGCONT に よ り 子 プ ロ セ ス が 再 開 さ れ た )。

WNOHANGoptions に 指 定 さ れ て い て 、 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 に 適 切 な 値 を 設 定 す る 。

エ ラ ー

ECHILD

(wait() の 場 合 ) 呼 び 出 し 元 プ ロ セ ス に は 、 wait を 行 っ て い な い 子 プ ロ セ ス は な い 。

ECHILD

(waitpid() か waitid() の 場 合 ) pid (waitpid()) か idtypeid (waitid()) で 指 定 し た プ ロ セ ス が 存 在 し な い か 、 呼 び 出 し 元 プ ロ セ ス の 子 プ ロ セ ス で な い (SIGCHLD の 動 作 に SIG_IGN を 設 定 し た 場 合 に は 、 自 分 自 身 の 子 プ ロ セ ス で も 起 こ り う る 。 ス レ ッ ド に 関 し て は 「 Linux で の 注 意 」 の 節 も 参 照 す る こ と )。

EINTR

WNOHANG が 設 定 さ れ て お ら ず 、 禁 止 (block) さ れ て い な い シ グ ナ ル や SIGCHLD を 受 信 し た 。 signal(7) 参 照 。

EINVAL

options 引 き 数 が 不 正 で あ る 。

準 拠

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() の 呼 び 出 し は 全 て の 子 プ ロ セ ス が 終 了 す る ま で 停 止 し 、 子 プ ロ セ ス が 全 部 終 了 し た 後 errnoECHILD を 設 定 し て 失 敗 す る 。 (も と も と の POSIX 標 準 は SIGCHLDSIG_IGN を 設 定 し た 場 合 の 振 る 舞 い を 未 規 定 の ま ま に し て い る 。 SIGCHLD の デ フ ォ ル ト の 動 作 が 「 無 視 」 で あ る に も か か わ ら ず 、 SIGCHLD の 動 作 と し て SIG_IGN を 明 示 的 に 設 定 し た 場 合 に は ゾ ン ビ プ ロ セ ス の 子 プ ロ セ ス の 扱 い が 異 な る 点 に 注 意 す る こ と 。 )

Linux 2.6 は こ の 仕 様 に 準 拠 し て い る 。 し か し 、 Linux 2.4 (と そ れ 以 前 の バ ー ジ ョ ン ) は そ う で は な い : SIGCHLD が 無 視 さ れ る 状 態 で wait() ま た は waitpid() が 呼 び 出 さ れ た 場 合 、 SIGCHLD が 無 視 さ れ て い な い か の よ う に 振 る 舞 う 。 つ ま り 、 呼 び 出 し に よ っ て 次 の 子 プ ロ セ ス の 終 了 ま で ブ ロ ッ ク さ れ 、 終 了 し た 子 プ ロ セ ス の PID と 状 態 が 返 さ れ る 。

Linux で の 注 意
Linux カ ー ネ ル で は 、 カ ー ネ ル に よ っ て ス ケ ジ ュ ー ル さ れ る ス レ ッ ド は プ ロ セ ス と 明 確 に 区 別 で き る 構 成 要 素 で は な い 。 ス レ ッ ド は Linux 固 有 の clone(2) シ ス テ ム コ ー ル を 使 用 し て 生 成 さ れ る プ ロ セ ス に 過 ぎ な い 。 移 植 性 の あ る pthread_create(3) コ ー ル の よ う な 他 の ル ー チ ン は clone(2) を 使 用 し て 実 装 さ れ て い る ; こ れ ら で は waitid() を 使 う こ と は で き な い 。 Linux 2.4 よ り 前 で は 、 ス レ ッ ド は 単 に 特 殊 な プ ロ セ ス で あ っ た の で 、 例 え 同 じ ス レ ッ ド グ ル ー プ で あ っ て も 、 あ る ス レ ッ ド が 別 の ス レ ッ ド の 子 プ ロ セ ス が 終 了 す る の を 待 つ こ と は 出 来 な か っ た 。 し か し 、 POSIX で は こ の よ う な 機 能 を 規 定 し て お り 、 Linux 2.4 以 降 で は 、 あ る ス レ ッ ド が 同 じ ス レ ッ ド グ ル ー プ の 他 の ス レ ッ ド の 子 プ ロ セ ス が 終 了 す る の を 待 つ こ と が で き る よ う に な っ た 。 そ し て 将 来 は こ れ が デ フ ォ ル ト の 動 作 に な る で あ ろ う 。

clone(2) を 用 い て 作 ら れ た 子 プ ロ セ ス に は 、 以 下 の Linux 固 有 の options が 使 用 で き る 。
__WCLONE

"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() を 呼 び 出 す ア プ リ ケ ー シ ョ ン は 、 infopsiginfo_t 構 造 体 を 指 し て い る こ と (つ ま り infop が NULL で な い ポ イ ン タ ー で あ る こ と ) を 保 証 し な け れ ば な ら な い 。 Linux で は 、 infop が NULL の 場 合 、 waitid() は 成 功 し 、 wait し て い る 子 プ ロ セ ス の プ ロ セ ス ID を 返 す 。 ア プ リ ケ ー シ ョ ン は 、 こ の 食 い 違 っ た 、 非 標 準 で 、 不 必 要 な 機 能 に 依 存 し な い よ う に す べ き で あ る 。

以 下 の プ ロ グ ラ ム は 、 fork(2)waitpid() の 使 用 方 法 の 例 を 示 し て い る 。 こ の プ ロ グ ラ ム で は 子 プ ロ セ ス を 生 成 す る 。 コ マ ン ド ラ イ ン 引 き 数 が 指 定 さ れ な か っ た と き は 、 子 プ ロ セ ス は pause(2) を 使 っ て そ の 実 行 を 一 時 停 止 し 、 ユ ー ザ ー が そ の 子 プ ロ セ ス に シ グ ナ ル を 送 信 で き る よ う に す る 。 コ マ ン ド ラ イ ン 引 き 数 が 指 定 さ れ た 場 合 は 、 子 プ ロ セ ス は 直 ち に 終 了 し 、 コ マ ン ド ラ イ ン で 指 定 さ れ た 整 数 を 終 了 ス テ ー タ ス と し て 使 用 す る 。 親 プ ロ セ ス は 、 waitpid() を 使 っ て 子 プ ロ セ ス を 監 視 し 、 wait の ス テ ー タ ス 値 を 上 記 の W*() マ ク ロ を 使 っ て 解 析 す る と い う ル ー プ を 実 行 す る 。 以 下 の シ ェ ル の セ ッ シ ョ ン は こ の プ ロ グ ラ ム の 使 用 例 を 示 し た も の で あ る 。

$ ./a.out &
Child PID is 32360
[1] 32359
$ kill −STOP 32360
stopped by signal 19
$ kill −CONT 32360
continued
$ kill −TERM 32360
killed by signal 15
[1]+ Done ./a.out
$ プ ロ グ ラ ム の ソ ー ス

#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

int
main(int argc, char *argv[])
{
pid_t cpid, w;
int status;

cpid = fork();
if (cpid == −1) {
perror("fork");
exit(EXIT_FAILURE); }

if (cpid == 0) { /* Code executed by child */
printf("Child PID is %ld\n", (long) getpid());
if (argc == 1)
pause(); /* Wait for signals */
_exit(atoi(argv[1])); }
else { /* Code executed by parent */
do {
w = waitpid(cpid, &status, WUNTRACED | WCONTINUED);
if (w == −1) {
perror("waitpid");
exit(EXIT_FAILURE); }

if (WIFEXITED(status)) {
printf("exited, status=%d\n", WEXITSTATUS(status)); }
else if (WIFSIGNALED(status)) {
printf("killed by signal %d\n", WTERMSIG(status)); }
else if (WIFSTOPPED(status)) {
printf("stopped by signal %d\n", WSTOPSIG(status)); }
else if (WIFCONTINUED(status)) {
printf("continued\n"); } }
while (!WIFEXITED(status) && !WIFSIGNALED(status));
exit(EXIT_SUCCESS); } }

関 連 項 目

_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/ に 書 か れ て い る 。

COMMENTS