X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=release%2Fman2%2Fwait.2;h=52498b133a7a8ef6f8744d54b5db0dd862334792;hb=4fa3e54b837e5814a4598ec901d77446bf5cb9b3;hp=745856c0efc1cea1e6112c3d3718a1e8089b5a88;hpb=ce024239a1d8e74a7a44f7c24cee4375cb13b3ef;p=linuxjm%2FLDP_man-pages.git diff --git a/release/man2/wait.2 b/release/man2/wait.2 index 745856c0..52498b13 100644 --- a/release/man2/wait.2 +++ b/release/man2/wait.2 @@ -47,546 +47,271 @@ .\" 2005-05-10, mtk, __W* flags can't be used with waitid() .\" 2008-07-04, mtk, removed erroneous text about SA_NOCLDSTOP .\" -.\" Japanese Version Copyright (c) 1997 HANATAKA Shinya all rights reserved. -.\" Japanese Version Copyright (c) 2005 Akihiro MOTOKI all rights reserved. -.\" Translated 1997-03-04, HANATAKA Shinya -.\" Modified 2000-09-23, HANATAKA Shinya -.\" Updated 2001-06-25, Kentaro Shirakata -.\" Updated 2001-10-15, Kentaro Shirakata -.\" Updated 2001-12-13, Kentaro Shirakata -.\" Updated 2002-10-21, Kentaro Shirakata -.\" Updated 2003-01-27, Kentaro Shirakata -.\" Updated 2003-09-12, Kentaro Shirakata -.\" Updated 2005-03-19, Akihiro MOTOKI -.\" Updated 2005-12-26, Akihiro MOTOKI -.\" Updated 2008-07-31, Akihiro MOTOKI, LDP v3.05 +.\"******************************************************************* .\" -.\"WORD: signal handling シグナル処理 -.\"WORD: suspend 停止(suspend) -.\"WORD: zombie ゾンビ(zombie) -.\"WORD: child process 子プロセス -.\"WORD: process group プロセス・グループ -.\"WORD: process group ID プロセス・グループID -.\"WORD: stop 停止(stop) -.\"WORD: effective user ID 実効ユーザーID -.\"WORD: block 禁止(block) +.\" This file was generated with po4a. Translate the source file. .\" -.TH WAIT 2 2010-09-26 "Linux" "Linux Programmer's Manual" +.\"******************************************************************* +.TH WAIT 2 2010\-09\-26 Linux "Linux Programmer's Manual" .SH 名前 wait, waitpid, waitid \- プロセスの状態変化を待つ .SH 書式 -.B #include +\fB#include \fP .br -.B #include +\fB#include \fP .sp -.BI "pid_t wait(int *" "status" ); +\fBpid_t wait(int *\fP\fIstatus\fP\fB);\fP -.BI "pid_t waitpid(pid_t " pid ", int *" status ", int " options ); +\fBpid_t waitpid(pid_t \fP\fIpid\fP\fB, int *\fP\fIstatus\fP\fB, int \fP\fIoptions\fP\fB);\fP -.BI "int waitid(idtype_t " idtype ", id_t " id \ -", siginfo_t *" infop ", int " options ); +\fBint waitid(idtype_t \fP\fIidtype\fP\fB, id_t \fP\fIid\fP\fB, siginfo_t *\fP\fIinfop\fP\fB, +int \fP\fIoptions\fP\fB);\fP .sp .in -4n -glibc 向けの機能検査マクロの要件 -.RB ( feature_test_macros (7) -参照): +glibc 向けの機能検査マクロの要件 (\fBfeature_test_macros\fP(7) 参照): .in .sp .ad l .PD 0 -.BR waitid (): +\fBwaitid\fP(): .RS 4 -_SVID_SOURCE || -_XOPEN_SOURCE\ >=\ 500 || -_XOPEN_SOURCE\ &&\ _XOPEN_SOURCE_EXTENDED +_SVID_SOURCE || _XOPEN_SOURCE\ >=\ 500 || _XOPEN_SOURCE\ &&\ _XOPEN_SOURCE_EXTENDED .br || /* glibc 2.12 以降: */ _POSIX_C_SOURCE\ >=\ 200809L .RE .PD .ad .SH 説明 -これらのシステムコールはいずれも、呼び出し元プロセスの子プロセスの -状態変化を待ち、状態が変化したその子プロセスの情報を取得するのに -使用される。 -状態変化とは以下のいずれかである: -子プロセスの終了、シグナルによる子プロセスの停止、 -シグナルによる子プロセスの再開。 -子プロセスが終了した場合は、wait を実行することで、 -システムがその子プロセスに関連するリソースを解放できるようになる。 -wait が実行されなかった場合には、終了した子プロセスは -「ゾンビ」状態で残り続ける (下記の注意の章を参照のこと)。 +これらのシステムコールはいずれも、呼び出し元プロセスの子プロセスの 状態変化を待ち、状態が変化したその子プロセスの情報を取得するのに 使用される。 +状態変化とは以下のいずれかである: 子プロセスの終了、シグナルによる子プロセスの停止、 シグナルによる子プロセスの再開。 +子プロセスが終了した場合は、wait を実行することで、 システムがその子プロセスに関連するリソースを解放できるようになる。 wait +が実行されなかった場合には、終了した子プロセスは 「ゾンビ」状態で残り続ける (下記の注意の章を参照のこと)。 -子プロセスの状態変化がすでに発生していた場合、これらのコールは -すぐに復帰する。それ以外の場合は、子プロセスの状態変化が起こるか、 -シグナルハンドラによりシステムコールが中断されるまで、 -停止 (block) する (後者は、 -.BR sigaction (2) -の -.B SA_RESTART -フラグによりシステムコールが自動的に再スタートするようになっていない -場合の動作である)。 -以下の説明では、状態変化が起こったがこれらのシステムコールのいずれかに -よって待たれていない子プロセスを -.I waitable -(待ち可能) と呼ぶ。 +子プロセスの状態変化がすでに発生していた場合、これらのコールは すぐに復帰する。それ以外の場合は、子プロセスの状態変化が起こるか、 +シグナルハンドラによりシステムコールが中断されるまで、 停止 (block) する (後者は、 \fBsigaction\fP(2) の +\fBSA_RESTART\fP フラグによりシステムコールが自動的に再スタートするようになっていない 場合の動作である)。 +以下の説明では、状態変化が起こったがこれらのシステムコールのいずれかに よって待たれていない子プロセスを \fIwaitable\fP (待ち可能) と呼ぶ。 .SS "wait() と waitpid()" -.BR wait () -システムコールは、子プロセスのいずれかが終了するまで -呼び出し元のプロセスの実行を一時停止する。 -以下の二つの呼び出しは等価である: +\fBwait\fP() システムコールは、子プロセスのいずれかが終了するまで 呼び出し元のプロセスの実行を一時停止する。 呼び出し +\fIwait(&status)\fP は以下と等価である: .nf - wait(&status); - waitpid(\-1, &status, 0); .fi -.BR waitpid () -システムコールは、 -.I pid -引き数で指定した子プロセスの状態変化が起こるまで、 -呼び出し元のプロセスの実行を一時停止する。デフォルトでは、 -.BR waitpid () -は子プロセスの終了だけを待つが、この動作は -.I options +\fBwaitpid\fP() システムコールは、 \fIpid\fP 引き数で指定した子プロセスの状態変化が起こるまで、 +呼び出し元のプロセスの実行を一時停止する。デフォルトでは、 \fBwaitpid\fP() は子プロセスの終了だけを待つが、この動作は \fIoptions\fP 引き数により変更可能である。 -.I pid -に指定できる値は以下の通り: +\fIpid\fP に指定できる値は以下の通り: .IP "< \-1" -プロセスグループID が -.I pid -の絶対値に等しい子プロセスのいずれかが終了するまでを待つ。 +プロセスグループID が \fIpid\fP の絶対値に等しい子プロセスのいずれかが終了するまでを待つ。 .IP \-1 子プロセスのどれかが終了するまで待つ。 .IP 0 -プロセスグループID が呼び出したプロセスのものと等しい -子プロセスを待つ。 +プロセスグループID が呼び出したプロセスのものと等しい 子プロセスを待つ。 .IP "> 0" -プロセスID が -.I pid -に等しい子プロセスを待つ。 +プロセスID が \fIpid\fP に等しい子プロセスを待つ。 .PP -.I options -の値は次の定数の 0 個以上の論理和である: -.TP 12 -.B WNOHANG +\fIoptions\fP の値は次の定数の 0 個以上の論理和である: +.TP 12 +\fBWNOHANG\fP 状態変化が起こった子プロセスがない場合にすぐに復帰する。 -.TP -.B WUNTRACED -子プロセスが停止した場合にも復帰する (子プロセスが -.BR ptrace (2) -でトレースされている場合は除く)。 -このオプションが指定されていない場合でも、停止したプロセスが -「トレース (traced)」されていれば、子プロセスの状態が報告される。 -.TP -.BR WCONTINUED " (Linux 2.6.10 以降)" -停止した子プロセスが -.B SIGCONT -の配送により再開した場合にも復帰する。 +.TP +\fBWUNTRACED\fP +子プロセスが停止した場合にも復帰する (子プロセスが \fBptrace\fP(2) でトレースされている場合は除く)。 +このオプションが指定されていない場合でも、停止したプロセスが 「トレース (traced)」されていれば、子プロセスの状態が報告される。 +.TP +\fBWCONTINUED\fP (Linux 2.6.10 以降) +停止した子プロセスが \fBSIGCONT\fP の配送により再開した場合にも復帰する。 .PP (Linux 専用オプションについては後述する) .PP -.I status -が NULL でなければ、 -.BR wait () -や -.BR waitpid () -は -.I status -で指す \fIint\fP に状態情報を格納する。 -この整数は以下のマクロを使って検査できる。 -(これらのマクロの引き数には、 -.BR wait () -や -.BR waitpid () +\fIstatus\fP が NULL でなければ、 \fBwait\fP() や \fBwaitpid\fP() は \fIstatus\fP で指す \fIint\fP +に状態情報を格納する。 この整数は以下のマクロを使って検査できる。 (これらのマクロの引き数には、 \fBwait\fP() や \fBwaitpid\fP() が書き込んだ整数そのものを指定する。ポインタではない!) -.TP -.BI WIFEXITED( status ) -子プロセスが正常に終了した場合に真を返す。 -「正常に」とは、 -.BR exit (3) -か -.BR _exit (2) -が呼び出された場合、もしくは +.TP +\fBWIFEXITED(\fP\fIstatus\fP\fB)\fP +子プロセスが正常に終了した場合に真を返す。 「正常に」とは、 \fBexit\fP(3) か \fB_exit\fP(2) が呼び出された場合、もしくは main() から復帰した場合である。 -.TP -.BI WEXITSTATUS( status ) -子プロセスの終了ステータスを返す。 -終了ステータスは -.I status -引き数の下位 8ビットで構成されており、 -.BR exit (3) -や -.BR _exit (2) -の呼び出し時に渡された値、もしくは main() の return 文の -引き数として指定された値である。 -このマクロを使用するのは -.B WIFEXITED -が真を返した場合だけにすべきである。 -.TP -.BI WIFSIGNALED( status ) +.TP +\fBWEXITSTATUS(\fP\fIstatus\fP\fB)\fP +子プロセスの終了ステータスを返す。 終了ステータスは \fIstatus\fP 引き数の下位 8ビットで構成されており、 \fBexit\fP(3) や +\fB_exit\fP(2) の呼び出し時に渡された値、もしくは main() の return 文の 引き数として指定された値である。 +このマクロを使用するのは \fBWIFEXITED\fP が真を返した場合だけにすべきである。 +.TP +\fBWIFSIGNALED(\fP\fIstatus\fP\fB)\fP 子プロセスがシグナルにより終了した場合に真を返す。 -.TP -.BI WTERMSIG( status ) -子プロセス終了の原因となったシグナルの番号を返す。 -このマクロを使用するのは -.B WIFSIGNALED -が真を返した場合だけにすべきである。 -.TP -.BI WCOREDUMP( status ) -子プロセスがコアダンプを生成した場合に真を返す。 -このマクロを使用するのは -.B WIFSIGNALED -が真を返した場合だけにすべきである。 -このマクロは POSIX.1-2001 では規定されておらず、 -(AIX, SunOS などの) いくつかの UNIX の実装では利用できない。 -必ず #ifdef WCOREDUMP ... #endif で括って使用すること。 -.TP -.BI WIFSTOPPED( status ) -子プロセスがシグナルの配送により停止した場合に真を返す。 -これが真になるのは、システムコールが -.B WUNTRACED -を指定して呼び出された場合か、子プロセスがトレースされている場合 -.RB ( ptrace (2) -参照) だけである。 -.TP -.BI WSTOPSIG( status ) -子プロセスを停止させたシグナルの番号を返す。 -このマクロを使用するのは -.B WIFSTOPPED -が 0 以外を返した場合だけにすべきである。 -.TP -.BI WIFCONTINUED( status ) -(Linux 2.6.10 以降) -子プロセスが -.B SIGCONT -の配送により再開した場合に真を返す。 -.SS "waitid()" -.BR waitid () -システムコール (Linux 2.6.9 以降で利用可能) を使うと、 +.TP +\fBWTERMSIG(\fP\fIstatus\fP\fB)\fP +子プロセス終了の原因となったシグナルの番号を返す。 このマクロを使用するのは \fBWIFSIGNALED\fP が真を返した場合だけにすべきである。 +.TP +\fBWCOREDUMP(\fP\fIstatus\fP\fB)\fP +子プロセスがコアダンプを生成した場合に真を返す。 このマクロを使用するのは \fBWIFSIGNALED\fP が真を返した場合だけにすべきである。 +このマクロは POSIX.1\-2001 では規定されておらず、 (AIX, SunOS などの) いくつかの UNIX の実装では利用できない。 必ず +#ifdef WCOREDUMP ... #endif で括って使用すること。 +.TP +\fBWIFSTOPPED(\fP\fIstatus\fP\fB)\fP +子プロセスがシグナルの配送により停止した場合に真を返す。 これが真になるのは、システムコールが \fBWUNTRACED\fP +を指定して呼び出された場合か、子プロセスがトレースされている場合 (\fBptrace\fP(2) 参照) だけである。 +.TP +\fBWSTOPSIG(\fP\fIstatus\fP\fB)\fP +子プロセスを停止させたシグナルの番号を返す。 このマクロを使用するのは \fBWIFSTOPPED\fP が 0 以外を返した場合だけにすべきである。 +.TP +\fBWIFCONTINUED(\fP\fIstatus\fP\fB)\fP +(Linux 2.6.10 以降) 子プロセスが \fBSIGCONT\fP の配送により再開した場合に真を返す。 +.SS waitid() +\fBwaitid\fP() システムコール (Linux 2.6.9 以降で利用可能) を使うと、 子プロセスのどの状態変化を待つかについてより細かな制御ができる。 -引き数 -.I idtype -と -.I id -でどの子プロセスを待つかを選択する: +引き数 \fIidtype\fP と \fIid\fP でどの子プロセスを待つかを選択する: .IP "\fIidtype\fP == \fBP_PID\fP" -プロセスID が -.I id -と一致する子プロセスを待つ。 +プロセスID が \fIid\fP と一致する子プロセスを待つ。 .IP "\fIidtype\fP == \fBP_PGID\fP" -プロセスグループID が -.I id -と一致する子プロセスを待つ。 +プロセスグループID が \fIid\fP と一致する子プロセスを待つ。 .IP "\fIidtype\fP == \fBP_ALL\fP" -子プロセス全部を対象に待つ。 -.I id -は無視される。 +子プロセス全部を対象に待つ。 \fIid\fP は無視される。 .PP -子プロセスのどの状態変化を待つかは以下のフラグで指定する -.RI ( options -には 1個以上のフラグの論理和をとって指定する): -.TP 12 -.B WEXITED +子プロセスのどの状態変化を待つかは以下のフラグで指定する (\fIoptions\fP には 1個以上のフラグの論理和をとって指定する): +.TP 12 +\fBWEXITED\fP 子プロセスの終了を待つ。 -.TP -.B WSTOPPED +.TP +\fBWSTOPPED\fP 子プロセスがシグナルの配送により停止するのを待つ。 -.TP -.B WCONTINUED -(停止していた) 子プロセスが -.B SIGCONT -が配送されて再開するのを待つ。 +.TP +\fBWCONTINUED\fP +(停止していた) 子プロセスが \fBSIGCONT\fP が配送されて再開するのを待つ。 .PP -さらに以下のフラグを論理和の形で -.I options -に指定できる: -.TP 12 -.B WNOHANG -.BR waitpid () -と同様。 -.TP -.B WNOWAIT -waitable 状態のプロセスをそのままにする。この後で wait コールを -使って、同じ子プロセスの状態情報をもう一度取得することができる。 +さらに以下のフラグを論理和の形で \fIoptions\fP に指定できる: +.TP 12 +\fBWNOHANG\fP +\fBwaitpid\fP() と同様。 +.TP +\fBWNOWAIT\fP +waitable 状態のプロセスをそのままにする。この後で wait コールを 使って、同じ子プロセスの状態情報をもう一度取得することができる。 .PP -成功した場合には、 -.BR waitid () -は -.I infop -が指す -.I siginfo_t -構造体の以下のフィールドを設定する: -.TP 12 +成功した場合には、 \fBwaitid\fP() は \fIinfop\fP が指す \fIsiginfo_t\fP 構造体の以下のフィールドを設定する: +.TP 12 \fIsi_pid\fP 子プロセスのプロセスID。 -.TP +.TP \fIsi_uid\fP -子プロセスの実ユーザID -(このフィールドは他のほとんどの実装では設定されない)。 -.TP +子プロセスの実ユーザID (このフィールドは他のほとんどの実装では設定されない)。 +.TP \fIsi_signo\fP -常に -.B SIGCHLD -が設定される。 -.TP +常に \fBSIGCHLD\fP が設定される。 +.TP \fIsi_status\fP -.BR _exit (2) -(か -.BR exit (3)) -に指定された子プロセスの終了ステータス、もしくは -子プロセスの終了、停止、再開の原因となったシグナルが設定される。 -このフィールドをどう解釈するかは、 -.I si_code +\fB_exit\fP(2) (か \fBexit\fP(3)) に指定された子プロセスの終了ステータス、もしくは +子プロセスの終了、停止、再開の原因となったシグナルが設定される。 このフィールドをどう解釈するかは、 \fIsi_code\fP フィールドを参照して決めることができる。 -.TP +.TP \fIsi_code\fP -以下のいずれかが設定される: -.B CLD_EXITED -(子プロセスが -.BR _exit (2) -を呼び出した); -.B CLD_KILLED -(シグナルにより子プロセスが kill された); -.B CLD_DUMPED -(シグナルにより子プロセスが kill され、コア・ダンプが行われた); -.B CLD_STOPPED -(シグナルにより子プロセスが停止した); -.BR CLD_TRAPPED -(トレースされていた子プロセスがトラップを受信した); -.B CLD_CONTINUED -.RB ( SIGCONT -により子プロセスが再開された)。 +以下のいずれかが設定される: \fBCLD_EXITED\fP (子プロセスが \fB_exit\fP(2) を呼び出した); \fBCLD_KILLED\fP +(シグナルにより子プロセスが kill された); \fBCLD_DUMPED\fP (シグナルにより子プロセスが kill され、コア・ダンプが行われた); +\fBCLD_STOPPED\fP (シグナルにより子プロセスが停止した); \fBCLD_TRAPPED\fP +(トレースされていた子プロセスがトラップを受信した); \fBCLD_CONTINUED\fP (\fBSIGCONT\fP により子プロセスが再開された)。 .PP -.B WNOHANG -が -.I options -に指定されていて、 -waitable 状態の子プロセスがなかった場合には、 -.BR waitid () -はすぐに 0 を返す。このとき、 -.I infop -が指す -.I siginfo_t -構造体の内容は不定である。 -.\" POSIX.1-2001 では、不定の可能性を残している。 -.\" (Linux を含む) ほとんどの実装では、この場合に構造体を 0 で埋めるが、 -.\" 少なくとも一つの実装 (AIX 5.1) ではそうならない。 -- MTK Nov 04 -この場合を waitable 状態の子プロセスがあった場合と区別するには、 -.BR waitid () -を呼び出す前に -.I si_pid -を 0 にしておき、コールが復帰した後でこのフィールドが 0 以外の値かどうか -をチェックすればよい。 +.\" POSIX.1-2001 leaves this possibility unspecified; most +.\" implementations (including Linux) zero out the structure +.\" in this case, but at least one implementation (AIX 5.1) +.\" does not -- MTK Nov 04 +\fBWNOHANG\fP が \fIoptions\fP に指定されていて、 waitable 状態の子プロセスがなかった場合には、 \fBwaitid\fP() +はすぐに 0 を返す。このとき、 \fIinfop\fP が指す \fIsiginfo_t\fP 構造体の内容は不定である。 この場合を waitable +状態の子プロセスがあった場合と区別するには、 \fBwaitid\fP() を呼び出す前に \fIsi_pid\fP を 0 +にしておき、コールが復帰した後でこのフィールドが 0 以外の値かどうか をチェックすればよい。 .SH 返り値 -.BR wait (): -成功すると、終了した子プロセスのプロセスID を返す。 -エラーの場合 \-1 を返す。 +\fBwait\fP(): 成功すると、終了した子プロセスのプロセスID を返す。 エラーの場合 \-1 を返す。 -.BR waitpid (): -成功すると、状態が変化した子プロセスのプロセスID を返す。 -.B WNOHANG -が指定されていて、 -.I pid -で指示された子プロセスが一つ以上存在するが、どの子プロセスでも -状態変化が起こっていなかった場合は、 0 を返す。 -エラーの場合 \-1 を返す。 +\fBwaitpid\fP(): 成功すると、状態が変化した子プロセスのプロセスID を返す。 \fBWNOHANG\fP が指定されていて、 \fIpid\fP +で指示された子プロセスが一つ以上存在するが、どの子プロセスでも 状態変化が起こっていなかった場合は、 0 を返す。 エラーの場合 \-1 を返す。 -.BR waitid (): -成功すると 0 を返す。 -.B WNOHANG -が指定されていて、 -.I pid -で指示された子プロセスで状態変化が起こっていなかった場合にも -0 を返す。 -エラーの場合 \-1 を返す。 .\" FIXME: As reported by Vegard Nossum, if infop is NULL, then waitid() .\" returns the PID of the child. Either this is a bug, or it is intended .\" behavior that needs to be documented. See my Jan 2009 LKML mail .\" "waitid() return value strangeness when infop is NULL". -エラーの場合、これらのシステムコールはいずれも -.I errno -に適切な値を設定する。 +\fBwaitid\fP(): 成功すると 0 を返す。 \fBWNOHANG\fP が指定されていて、 \fIpid\fP +で指示された子プロセスで状態変化が起こっていなかった場合にも 0 を返す。 エラーの場合 \-1 を返す。 エラーの場合、これらのシステムコールはいずれも +\fIerrno\fP に適切な値を設定する。 .SH エラー -.TP -.B ECHILD -.RB ( wait () -の場合) -呼び出し元プロセスには、wait を行っていない子プロセスはない。 -.TP -.B ECHILD -.RB ( waitpid () -か -.BR waitid () -の場合) -.I pid -.RB ( waitpid ()) -か -.I idtype -と -.I id -.RB ( waitid ()) -で指定したプロセスが存在しないか、呼び出し元プロセスの子プロセスでない -.RB ( SIGCHLD -の動作に -.B SIG_IGN -を設定した場合には、自分自身の子プロセスでも起こりうる。 -スレッドに関しては「Linux での注意」の節も参照すること)。 -.TP -.B EINTR -.B WNOHANG -が設定されておらず、禁止 (block) されていないシグナルや -.B SIGCHLD -を受信した。 -.BR signal (7) +.TP +\fBECHILD\fP +(\fBwait\fP() の場合) 呼び出し元プロセスには、wait を行っていない子プロセスはない。 +.TP +\fBECHILD\fP +(\fBwaitpid\fP() か \fBwaitid\fP() の場合) \fIpid\fP (\fBwaitpid\fP()) か \fIidtype\fP と +\fIid\fP (\fBwaitid\fP()) で指定したプロセスが存在しないか、呼び出し元プロセスの子プロセスでない (\fBSIGCHLD\fP の動作に +\fBSIG_IGN\fP を設定した場合には、自分自身の子プロセスでも起こりうる。 スレッドに関しては「Linux での注意」の節も参照すること)。 +.TP +\fBEINTR\fP +\fBWNOHANG\fP が設定されておらず、禁止 (block) されていないシグナルや \fBSIGCHLD\fP を受信した。 \fBsignal\fP(7) 参照。 -.TP -.B EINVAL -.I options -引き数が不正である。 +.TP +\fBEINVAL\fP +\fIoptions\fP 引き数が不正である。 .SH 準拠 -SVr4, 4.3BSD, POSIX.1-2001. +SVr4, 4.3BSD, POSIX.1\-2001. .SH 注意 -終了したが、wait されていない子プロセスは「ゾンビ」になる。 -後で親プロセスが wait を実行して子プロセスについての情報を取得できるように、 -カーネルはゾンビプロセスについて最小限の情報 (PID、終了ステータス、 -リソース使用状況) を保持する。 -ゾンビプロセスは、 wait によってシステムから削除されない限り、 -カーネルのプロセステーブルの 1 エントリを消費する。このプロセステーブルが -一杯になると、新たにプロセスを作ることができなくなる。 -親プロセスが終了すると、その親プロセスの「ゾンビ」の -子プロセスは (もしあれば) -.BR init (8) -の養子となる。 -.BR init (8) -は wait を自動的に実行し、ゾンビを削除する。 +終了したが、wait されていない子プロセスは「ゾンビ」になる。 後で親プロセスが wait を実行して子プロセスについての情報を取得できるように、 +カーネルはゾンビプロセスについて最小限の情報 (PID、終了ステータス、 リソース使用状況) を保持する。 ゾンビプロセスは、 wait +によってシステムから削除されない限り、 カーネルのプロセステーブルの 1 エントリを消費する。このプロセステーブルが +一杯になると、新たにプロセスを作ることができなくなる。 親プロセスが終了すると、その親プロセスの「ゾンビ」の 子プロセスは (もしあれば) +\fBinit\fP(8) の養子となる。 \fBinit\fP(8) は wait を自動的に実行し、ゾンビを削除する。 -POSIX.1-2001 では以下のように規定されている。 -.B SIGCHLD -の動作が -.B SIG_IGN -に設定されたか、 -.B SIGCHLD -に対して -.B SA_NOCLDWAIT -フラグが設定された場合 -.RB ( sigaction (2) -参照)、終了した子プロセスはゾンビにはならず、 -.BR wait () -や -.BR waitpid () -の呼び出しは全ての子プロセスが終了するまで停止し、 -子プロセスが全部終了した後 -.I errno -に -.B ECHILD -を設定して失敗する。 -(もともとの POSIX 標準は -.B SIGCHLD -に -.B SIG_IGN -を設定した場合の振る舞いを未規定のままにしている。 -.B SIGCHLD -のデフォルトの動作が「無視」であるにもかかわらず、 -.B SIGCHLD -の動作として -.B SIG_IGN -を明示的に設定した場合にはゾンビプロセスの子プロセスの扱いが -異なる点に注意すること。) -Linux 2.6 はこの仕様に準拠している。 -しかし、Linux 2.4 (とそれ以前のバージョン) はそうではない: -.B SIGCHLD -が無視される状態で -.BR wait () -または -.BR waitpid () -が呼び出された場合、 -.B SIGCHLD -が無視されていないかのように振る舞う。 -つまり、呼び出しによって次の子プロセスの終了までブロックされ、 -終了した子プロセスの PID と状態が返される。 -.SS Linux での注意 -Linux カーネルでは、カーネルによってスケジュールされるスレッドは -プロセスと明確に区別できる構成要素ではない。スレッドは Linux 固有の -.BR clone (2) -システムコールを使用して生成されるプロセスに過ぎない。 -移植性のある -.BR pthread_create (3) -コールのような他のルーチンは -.BR clone (2) -を使用して実装されている; -これらでは -.BR waitid () -を使うことはできない。 -Linux 2.4 より前では、スレッドは単に特殊なプロセスであったので、 -例え同じスレッドグループであっても、 -あるスレッドが別のスレッドの子プロセスが終了するのを待つことは出来なかった。 -しかし、POSIX ではこのような機能を規定しており、 -Linux 2.4 以降では、あるスレッドが同じスレッドグループの他のスレッドの -子プロセスが終了するのを待つことができるようになった。 +POSIX.1\-2001 では以下のように規定されている。 \fBSIGCHLD\fP の動作が \fBSIG_IGN\fP に設定されたか、 \fBSIGCHLD\fP +に対して \fBSA_NOCLDWAIT\fP フラグが設定された場合 (\fBsigaction\fP(2) 参照)、終了した子プロセスはゾンビにはならず、 +\fBwait\fP() や \fBwaitpid\fP() の呼び出しは全ての子プロセスが終了するまで停止し、 子プロセスが全部終了した後 \fIerrno\fP +に \fBECHILD\fP を設定して失敗する。 (もともとの POSIX 標準は \fBSIGCHLD\fP に \fBSIG_IGN\fP +を設定した場合の振る舞いを未規定のままにしている。 \fBSIGCHLD\fP のデフォルトの動作が「無視」であるにもかかわらず、 \fBSIGCHLD\fP +の動作として \fBSIG_IGN\fP を明示的に設定した場合にはゾンビプロセスの子プロセスの扱いが 異なる点に注意すること。) Linux 2.6 +はこの仕様に準拠している。 しかし、Linux 2.4 (とそれ以前のバージョン) はそうではない: \fBSIGCHLD\fP が無視される状態で +\fBwait\fP() または \fBwaitpid\fP() が呼び出された場合、 \fBSIGCHLD\fP が無視されていないかのように振る舞う。 +つまり、呼び出しによって次の子プロセスの終了までブロックされ、 終了した子プロセスの PID と状態が返される。 +.SS "Linux での注意" +Linux カーネルでは、カーネルによってスケジュールされるスレッドは プロセスと明確に区別できる構成要素ではない。スレッドは Linux 固有の +\fBclone\fP(2) システムコールを使用して生成されるプロセスに過ぎない。 移植性のある \fBpthread_create\fP(3) +コールのような他のルーチンは \fBclone\fP(2) を使用して実装されている; これらでは \fBwaitid\fP() を使うことはできない。 +Linux 2.4 より前では、スレッドは単に特殊なプロセスであったので、 例え同じスレッドグループであっても、 +あるスレッドが別のスレッドの子プロセスが終了するのを待つことは出来なかった。 しかし、POSIX ではこのような機能を規定しており、 Linux 2.4 +以降では、あるスレッドが同じスレッドグループの他のスレッドの 子プロセスが終了するのを待つことができるようになった。 そして将来はこれがデフォルトの動作になるであろう。 .LP -.BR clone (2) -を用いて作られた子プロセスには、以下の Linux 固有の -.I options -が使用できる。 -.TP -.B __WCLONE +\fBclone\fP(2) を用いて作られた子プロセスには、以下の Linux 固有の \fIoptions\fP が使用できる。 +.TP +\fB__WCLONE\fP .\" since 0.99pl10 -"clone" な子プロセスだけを待つ。 -指定されなかった場合は非 "clone" な子プロセスだけを待つ -("clone" な子プロセスは、終了時に親プロセスへ全くシグナルを送らないか、 -.B SIGCHLD -以外のシグナルを送る)。 -このオプションは -.B __WALL +"clone" な子プロセスだけを待つ。 指定されなかった場合は非 "clone" な子プロセスだけを待つ ("clone" +な子プロセスは、終了時に親プロセスへ全くシグナルを送らないか、 \fBSIGCHLD\fP 以外のシグナルを送る)。 このオプションは \fB__WALL\fP も指定された場合は無視される。 -.TP -.BR __WALL " (Linux 2.4 以降)" +.TP +\fB__WALL\fP (Linux 2.4 以降) .\" since patch-2.3.48 -"clone" であるかないかに関わらず、 -全ての子プロセスを待つ。 -.TP -.BR __WNOTHREAD " (Linux 2.4 以降)" +"clone" であるかないかに関わらず、 全ての子プロセスを待つ。 +.TP +\fB__WNOTHREAD\fP (Linux 2.4 以降) .\" since patch-2.4.0-test8 -同じスレッドグループの他のスレッドの子プロセスは待たない。 -Linux 2.4 より前ではデフォルトであった。 +同じスレッドグループの他のスレッドの子プロセスは待たない。 Linux 2.4 より前ではデフォルトであった。 .SH 例 -.\" fork.2 もこのサンプルプログラムを参照している。 -以下のプログラムは、 -.BR fork (2) -と -.BR waitpid () -の使用方法の例を示している。 -このプログラムでは子プロセスを生成する。 -コマンドライン引き数が指定されなかったときは、 -子プロセスは -.BR pause (2) -を使ってその実行を一時停止し、ユーザがその子プロセスに -シグナルを送信できるようにする。 -コマンドライン引き数が指定された場合は、 -子プロセスは直ちに終了し、 -コマンドラインで指定された整数を終了ステータスとして使用する。 -親プロセスは、 -.BR waitpid () -を使って子プロセスを監視し、 -wait のステータス値を上記の W*() マクロを使って解析するという -ループを実行する。 +.\" fork.2 refers to this example program. +以下のプログラムは、 \fBfork\fP(2) と \fBwaitpid\fP() の使用方法の例を示している。 このプログラムでは子プロセスを生成する。 +コマンドライン引き数が指定されなかったときは、 子プロセスは \fBpause\fP(2) を使ってその実行を一時停止し、ユーザがその子プロセスに +シグナルを送信できるようにする。 コマンドライン引き数が指定された場合は、 子プロセスは直ちに終了し、 +コマンドラインで指定された整数を終了ステータスとして使用する。 親プロセスは、 \fBwaitpid\fP() を使って子プロセスを監視し、 wait +のステータス値を上記の W*() マクロを使って解析するという ループを実行する。 -下記ののシェル・セッションはプログラムの実行例である: +以下のシェルのセッションはこのプログラムの使用例を示したものである。 .in +4n .nf -.RB "$" " ./a.out &" +$\fB ./a.out &\fP Child PID is 32360 [1] 32359 -.RB "$" " kill \-STOP 32360" +$\fB kill \-STOP 32360\fP stopped by signal 19 -.RB "$" " kill \-CONT 32360" +$\fB kill \-CONT 32360\fP continued -.RB "$" " kill \-TERM 32360" +$\fB kill \-TERM 32360\fP killed by signal 15 [1]+ Done ./a.out $ @@ -613,7 +338,7 @@ main(int argc, char *argv[]) } if (cpid == 0) { /* Code executed by child */ - printf("Child PID is %ld\\n", (long) getpid()); + printf("Child PID is %ld\en", (long) getpid()); if (argc == 1) pause(); /* Wait for signals */ _exit(atoi(argv[1])); @@ -627,13 +352,13 @@ main(int argc, char *argv[]) } if (WIFEXITED(status)) { - printf("exited, status=%d\\n", WEXITSTATUS(status)); + printf("exited, status=%d\en", WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { - printf("killed by signal %d\\n", WTERMSIG(status)); + printf("killed by signal %d\en", WTERMSIG(status)); } else if (WIFSTOPPED(status)) { - printf("stopped by signal %d\\n", WSTOPSIG(status)); + printf("stopped by signal %d\en", WSTOPSIG(status)); } else if (WIFCONTINUED(status)) { - printf("continued\\n"); + printf("continued\en"); } } while (!WIFEXITED(status) && !WIFSIGNALED(status)); exit(EXIT_SUCCESS); @@ -641,14 +366,6 @@ main(int argc, char *argv[]) } .fi .SH 関連項目 -.BR _exit (2), -.BR clone (2), -.BR fork (2), -.BR kill (2), -.BR ptrace (2), -.BR sigaction (2), -.BR signal (2), -.BR wait4 (2), -.BR pthread_create (3), -.BR credentials (7), -.BR signal (7) +\fB_exit\fP(2), \fBclone\fP(2), \fBfork\fP(2), \fBkill\fP(2), \fBptrace\fP(2), +\fBsigaction\fP(2), \fBsignal\fP(2), \fBwait4\fP(2), \fBpthread_create\fP(3), +\fBcredentials\fP(7), \fBsignal\fP(7)