Man page - waitpid(2)

Packages contains this manual

Available languages:

en fr it pl nl ja ru

Manual

WAIT

名 前
書 式
説 明
wait() と waitpid()
waitid()
返 り 値
エ ラ ー
準 拠
注 意
Linux で の 注 意
C ラ イ ブ ラ リ と カ ー ネ ル の 違 い
バ グ

プ ロ グ ラ ム の ソ ー ス
関 連 項 目
こ の 文 書 に つ い て

名 前

wait, waitpid, waitid - プ ロ セ ス の 状 態 変 化 を 待 つ

書 式

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

pid_t wait(int * wstatus );

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

int waitid(idtype_t idtype , id_t id , siginfo_t * infop , int options );
/* こ れ は glibc と POSIX の イ ン タ ー フ ェ イ ス で あ る 。
生 の シ ス テ ム コ ー ル に つ い て の 情 報 は 「 注 意 」 の 節 を 参 照 。 */

glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 ( feature_test_macros (7) 参 照 ):

waitid ():

glibc 2.26 以 降 : _XOPEN_SOURCE >= 500 ||
_POSIX_C_SOURCE >= 200809L
glibc 2.25 以 前 :
_XOPEN_SOURCE
|| /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
|| /* Glibc versions <= 2.19: */ _BSD_SOURCE

説 明

こ れ ら の シ ス テ ム コ ー ル は い ず れ も 、 呼 び 出 し 元 プ ロ セ ス の 子 プ ロ セ ス の 状 態 変 化 を 待 ち 、 状 態 が 変 化 し た そ の 子 プ ロ セ ス の 情 報 を 取 得 す る の に 使 用 さ れ る 。 状 態 変 化 と は 以 下 の い ず れ か で あ る : 子 プ ロ セ ス の 終 了 、 シ グ ナ ル に よ る 子 プ ロ セ ス の 停 止 、 シ グ ナ ル に よ る 子 プ ロ セ ス の 再 開 。 子 プ ロ セ ス が 終 了 し た 場 合 は 、 wait を 実 行 す る こ と で 、 シ ス テ ム が そ の 子 プ ロ セ ス に 関 連 す る リ ソ ー ス を 解 放 で き る よ う に な る 。 wait が 実 行 さ れ な か っ た 場 合 に は 、 終 了 し た 子 プ ロ セ ス は 「 ゾ ン ビ 」 状 態 で 残 り 続 け る (下 記 の 注 意 の 章 を 参 照 の こ と )。

子 プ ロ セ ス の 状 態 変 化 が す で に 発 生 し て い た 場 合 、 こ れ ら の コ ー ル は す ぐ に 復 帰 す る 。 そ れ 以 外 の 場 合 は 、 子 プ ロ セ ス の 状 態 変 化 が 起 こ る か 、 シ グ ナ ル ハ ン ド ラ ー に よ り シ ス テ ム コ ー ル が 中 断 さ れ る ま で 、 停 止 (block) す る (後 者 は 、 sigaction (2) の SA_RESTART フ ラ グ に よ り シ ス テ ム コ ー ル が 自 動 的 に 再 ス タ ー ト す る よ う に な っ て い な い 場 合 の 動 作 で あ る )。 以 下 の 説 明 で は 、 状 態 変 化 が 起 こ っ た が こ れ ら の シ ス テ ム コ ー ル の い ず れ か に よ っ て 待 た れ て い な い 子 プ ロ セ ス を waitable (待 ち 可 能 ) と 呼 ぶ 。

wait() と waitpid()

wait () シ ス テ ム コ ー ル は 、 子 プ ロ セ ス の い ず れ か が 終 了 す る ま で 呼 び 出 し 元 の ス レ ッ ド の 実 行 を 一 時 停 止 す る 。 呼 び 出 し wait(&wstatus) は 以 下 と 等 価 で あ る :

waitpid(-1, &wstatus, 0);

waitpid () シ ス テ ム コ ー ル は 、 pid 引 数 で 指 定 し た 子 プ ロ セ ス の 状 態 変 化 が 起 こ る ま で 、 呼 び 出 し 元 の ス レ ッ ド の 実 行 を 一 時 停 止 す る 。 デ フ ォ ル ト で は 、 waitpid () は 子 プ ロ セ ス の 終 了 だ け を 待 つ が 、 こ の 動 作 は options 引 数 に よ り 変 更 可 能 で あ る 。

pid に 指 定 で き る 値 は 以 下 の 通 り :

< -1

プ ロ セ ス グ ル ー プ ID が pid の 絶 対 値 に 等 し い 子 プ ロ セ ス の い ず れ か が 終 了 す る ま で を 待 つ 。

-1

子 プ ロ セ ス の ど れ か が 終 了 す る ま で 待 つ 。

0

プ ロ セ ス グ ル ー プ ID が 、 waitpid () が 呼 ば れ た 時 点 で の 呼 び 出 し 元 の プ ロ セ ス の プ ロ セ ス グ ル ー プ ID と 等 し い 子 プ ロ セ ス を 待 つ 。

> 0

プ ロ セ ス ID が pid に 等 し い 子 プ ロ セ ス を 待 つ 。

options の 値 は 次 の 定 数 の 0 個 以 上 の 論 理 和 で あ る :
WNOHANG

状 態 変 化 が 起 こ っ た 子 プ ロ セ ス が な い 場 合 に す ぐ に 復 帰 す る 。

WUNTRACED

子 プ ロ セ ス が 停 止 し た 場 合 に も 復 帰 す る (子 プ ロ セ ス が ptrace (2) で ト レ ー ス さ れ て い る 場 合 は 除 く )。 こ の オ プ シ ョ ン が 指 定 さ れ て い な い 場 合 で も 、 停 止 し た プ ロ セ ス が 「 ト レ ー ス (traced)」 さ れ て い れ ば 、 子 プ ロ セ ス の 状 態 が 報 告 さ れ る 。

WCONTINUED (Linux 2.6.10 以 降 )

停 止 し た 子 プ ロ セ ス が SIGCONT の 配 送 に よ り 再 開 し た 場 合 に も 復 帰 す る 。

(Linux 専 用 オ プ シ ョ ン に つ い て は 後 述 す る )

wstatus が NULL で な け れ ば 、 wait () や waitpid () は status で 指 す int に 状 態 情 報 を 格 納 す る 。 こ の 整 数 は 以 下 の マ ク ロ を 使 っ て 検 査 で き る 。 (こ れ ら の マ ク ロ の 引 数 に は 、 wait () や waitpid () が 書 き 込 ん だ 整 数 そ の も の を 指 定 す る 。 ポ イ ン タ ー で は な い !)
WIFEXITED(
wstatus )

子 プ ロ セ ス が 正 常 に 終 了 し た 場 合 に 真 を 返 す 。 「 正 常 に 」 と は 、 exit (3) か _exit (2) が 呼 び 出 さ れ た 場 合 、 も し く は main() か ら 復 帰 し た 場 合 で あ る 。

WEXITSTATUS( wstatus )

子 プ ロ セ ス の 終 了 ス テ ー タ ス を 返 す 。 終 了 ス テ ー タ ス は status 引 数 の 下 位 8ビ ッ ト で 構 成 さ れ て お り 、 exit (3) や _exit (2) の 呼 び 出 し 時 に 渡 さ れ た 値 、 も し く は main() の return 文 の 引 数 と し て 指 定 さ れ た 値 で あ る 。 こ の マ ク ロ を 使 用 す る の は WIFEXITED が 真 を 返 し た 場 合 だ け に す べ き で あ る 。

WIFSIGNALED( wstatus )

子 プ ロ セ ス が シ グ ナ ル に よ り 終 了 し た 場 合 に 真 を 返 す 。

WTERMSIG( wstatus )

子 プ ロ セ ス 終 了 の 原 因 と な っ た シ グ ナ ル の 番 号 を 返 す 。 こ の マ ク ロ を 使 用 す る の は WIFSIGNALED が 真 を 返 し た 場 合 だ け に す べ き で あ る 。

WCOREDUMP( wstatus )

returns true if the child produced a core dump (see core (5)). This macro should be employed only if WIFSIGNALED returned true.

This macro is not specified in POSIX.1-2001 and is not available on some UNIX implementations (e.g., AIX, SunOS). Therefore, enclose its use inside #ifdef WCOREDUMP ... #endif .

WIFSTOPPED( wstatus )

子 プ ロ セ ス が シ グ ナ ル の 配 送 に よ り 停 止 し た 場 合 に 真 を 返 す 。 こ れ が 真 に な る の は 、 シ ス テ ム コ ー ル が WUNTRACED を 指 定 し て 呼 び 出 さ れ た 場 合 か 、 子 プ ロ セ ス が ト レ ー ス さ れ て い る 場 合 ( ptrace (2) 参 照 ) だ け で あ る 。

WSTOPSIG( wstatus )

子 プ ロ セ ス を 停 止 さ せ た シ グ ナ ル の 番 号 を 返 す 。 こ の マ ク ロ を 使 用 す る の は WIFSTOPPED が 0 以 外 を 返 し た 場 合 だ け に す べ き で あ る 。

WIFCONTINUED( wstatus )

(Linux 2.6.10 以 降 ) 子 プ ロ セ ス が SIGCONT の 配 送 に よ り 再 開 し た 場 合 に 真 を 返 す 。

waitid()

waitid () シ ス テ ム コ ー ル (Linux 2.6.9 以 降 で 利 用 可 能 ) を 使 う と 、 子 プ ロ セ ス の ど の 状 態 変 化 を 待 つ か に つ い て よ り 細 か な 制 御 が で き る 。

引 数 idtype id で ど の 子 プ ロ セ ス を 待 つ か を 選 択 す る :
idtype
== P_PID

プ ロ セ ス ID が id と 一 致 す る 子 プ ロ セ ス を 待 つ 。

idtype == P_PIDFD (since Linux 5.4)

Wait for the child referred to by the PID file descriptor specified in id . (See pidfd_open (2) for further information on PID file descriptors.)

idtype == P_PGID

Wait for any child whose process group ID matches id . Since Linux 5.4, if id is zero, then wait for any child that is in the same process group as the caller’s process group at the time of the call.

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 に よ り 子 プ ロ セ ス が 再 開 さ れ た )。

If WNOHANG was specified in options and there were no children in a waitable state, then waitid () returns 0 immediately and the state of the siginfo_t structure pointed to by infop depends on the implementation. To (portably) distinguish this case from that where a child was in a waitable state, zero out the si_pid field before the call and check for a nonzero value in this field after the call returns.

POSIX.1-2008 Technical Corrigendum 1 (2013) adds the requirement that when WNOHANG is specified in options and there were no children in a waitable state, then waitid () should zero out the si_pid and si_signo fields of the structure. On Linux and other implementations that adhere to this requirement, it is not necessary to zero out the si_pid field before calling waitid (). However, not all implementations follow the POSIX.1 specification on this point.

返 り 値

wait (): 成 功 す る と 、 終 了 し た 子 プ ロ セ ス の プ ロ セ ス ID を 返 す 。 エ ラ ー の 場 合 -1 を 返 す 。

waitpid (): 成 功 す る と 、 状 態 が 変 化 し た 子 プ ロ セ ス の プ ロ セ ス ID を 返 す 。 WNOHANG が 指 定 さ れ て い て 、 pid で 指 示 さ れ た 子 プ ロ セ ス が 一 つ 以 上 存 在 す る が 、 ど の 子 プ ロ セ ス で も 状 態 変 化 が 起 こ っ て い な か っ た 場 合 は 、 0 を 返 す 。 エ ラ ー の 場 合 -1 を 返 す 。

waitid (): 成 功 す る と 0 を 返 す 。 WNOHANG が 指 定 さ れ て い て 、 pid で 指 示 さ れ た 子 プ ロ セ ス で 状 態 変 化 が 起 こ っ て い な か っ た 場 合 に も 0 を 返 す 。

エ ラ ー の 場 合 -1 を 返 す 。 エ ラ ー の 場 合 、 こ れ ら の シ ス テ ム コ ー ル は い ず れ も errno に 適 切 な 値 を 設 定 す る 。

エ ラ ー

ECHILD

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

ECHILD

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

EINTR

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

EINVAL

options 引 数 が 不 正 で あ る 。

準 拠

SVr4, 4.3BSD, POSIX.1-2001.

注 意

A child that terminates, but has not been waited for becomes a "zombie". The kernel maintains a minimal set of information about the zombie process (PID, termination status, resource usage information) in order to allow the parent to later perform a wait to obtain information about the child. As long as a zombie is not removed from the system via a wait, it will consume a slot in the kernel process table, and if this table fills, it will not be possible to create further processes. If a parent process terminates, then its "zombie" children (if any) are adopted by init (1), (or by the nearest "subreaper" process as defined through the use of the prctl (2) PR_SET_CHILD_SUBREAPER operation); init (1) automatically performs a wait to remove the zombies.

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 で の 注 意

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

The following Linux-specific options are for use with children created using clone (2); they can also, since Linux 4.7, be used with waitid ():
__WCLONE

"clone" な 子 プ ロ セ ス だ け を 待 つ 。 指 定 さ れ な か っ た 場 合 は 非 "clone" な 子 プ ロ セ ス だ け を 待 つ ("clone" な 子 プ ロ セ ス は 、 終 了 時 に 親 プ ロ セ ス へ 全 く シ グ ナ ル を 送 ら な い か 、 SIGCHLD 以 外 の シ グ ナ ル を 送 る )。 こ の オ プ シ ョ ン は __WALL も 指 定 さ れ た 場 合 は 無 視 さ れ る 。

__WALL (Linux 2.4 以 降 )

"clone" で あ る か な い か に 関 わ ら ず 、 全 て の 子 プ ロ セ ス を 待 つ 。

__WNOTHREAD (Linux 2.4 以 降 )

同 じ ス レ ッ ド グ ル ー プ の 他 の ス レ ッ ド の 子 プ ロ セ ス は 待 た な い 。 Linux 2.4 よ り 前 で は デ フ ォ ル ト で あ っ た 。

Since Linux 4.7, the __WALL flag is automatically implied if the child is being ptraced.

C ラ イ ブ ラ リ と カ ー ネ ル の 違 い

wait () is actually a library function that (in glibc) is implemented as a call to wait4 (2).

On some architectures, there is no waitpid () system call; instead, this interface is implemented via a C library wrapper function that calls wait4 (2).

生 の 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 &
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 <stdint.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

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

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

if (cpid == 0) { /* Code executed by child */
printf("Child PID is %jd\n", (intmax_t) getpid());
if (argc == 1)
pause(); /* Wait for signals */
_exit(atoi(argv[1]));

} else { /* Code executed by parent */
do {
w = waitpid(cpid, &wstatus, WUNTRACED | WCONTINUED);
if (w == -1) {
perror("waitpid");
exit(EXIT_FAILURE);
}

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

関 連 項 目

_exit (2), clone (2), fork (2), kill (2), ptrace (2), sigaction (2), signal (2), wait4 (2), pthread_create (3), core (5), credentials (7), signal (7)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man-pages プ ロ ジ ェ ク ト の リ リ ー ス 5.10 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は https://www.kernel.org/doc/man-pages/ に 書 か れ て い る 。