.\" Copyright (c) 1993 by Thomas Koenig (ig25@rz.uni-karlsruhe.de)
+.\" and Copyright (c) 2014 by Michael Kerrisk <mtk.manpages@gmail.com>
.\"
.\" %%%LICENSE_START(VERBATIM)
.\" Permission is granted to make and distribute verbatim copies of this
.\" Updated 2001-10-16, Kentaro Shirakata <argrath@ub32.org>
.\" Updated 2005-02-27, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
.\"
-.TH SYSTEM 3 2010\-09\-10 "" "Linux Programmer's Manual"
+.TH SYSTEM 3 2014\-05\-10 "" "Linux Programmer's Manual"
.SH 名前
system \- シェルコマンドの実行
.SH 書式
\fBint system(const char *\fP\fIcommand\fP\fB);\fP
.fi
.SH 説明
-\fBsystem\fP() は \fIcommand\fP で指定したコマンドを \fB/bin/sh \-c\fP \fIcommand\fP
-の形で実行する。指定したコマンドが終了すればこの関数も終了する。 コマンド実行中は、 \fBSIGCHLD\fP はブロックされ、 \fBSIGINT\fP と
-\fBSIGQUIT\fP は無視される。
+\fBsystem\fP() ライブラリ関数は、\fBfork\fP(2) を使って子プロセスを作成し、その子プロセスは以下のように \fIcommand\fP
+で指定されたシェルコマンドを \fBexecl\fP(3) を使って実行する。
+
+ execl("/bin/sh", "sh". "\-c", command, (char *) 0);
+
+\fBsystem\fP() が返るのはコマンドが完了した後である。
+
+コマンドの実行中は、 \fBsystem\fP() を呼び出したプロセスでは、 \fBSIGCHLD\fP はブロックされ、 \fBSIGINT\fP と
+\fBSIGQUIT\fP は無視される (\fIcommand\fP を実行する子プロセスでは、これらのシグナルはデフォルトの処理方法にしたがって処理される)。
+
+\fIcommand\fP が NULL の場合、 \fBsystem\fP() はそのシステムでシェルが利用可能かを示すステータスを返す。
.SH 返り値
-エラーが発生した場合 (\fBfork\fP(2) に失敗した場合など)、\-1 を返す。 そうでなければ、コマンドのステータスを返す。
-後者の場合、ステータスは \fBwait\fP(2) で定義されているフォーマットで返ってくる。 従って、コマンドの終了コードは
-\fIWEXITSTATUS(status)\fP で得ることが出来る。 \fI/bin/sh\fP が実行出来なかった場合、 終了ステータスはコマンドが
-\fIexit(127)\fP を実行した場合と同じになる。
+\fBsystem\fP() の返り値は以下のいずれかである。
+.IP * 3
+\fIcommand\fP が NULL の場合、 シェルが利用可能ならゼロ以外の値、利用不可なら 0。
+.IP *
+子プロセスを作成できなかった場合、または子プロセスのステータスを取得できなかった場合、 返り値は \-1 である。
+.IP *
+子プロセスでシェルを実行できなかった場合、 返り値は子プロセスがステータス 127 で \fB_exit\fP(2) を呼び出して終了したのと同じになる。
+.IP *
+システムコールがすべて成功した場合、 返り値は \fIcommand\fP を実行するのに使用された子プロセスのシェルの終了ステータスとなる
+(シェルの終了ステータスはそのシェルが実行した最後のコマンドの終了ステータスである)。
.PP
-\fIcommand\fP の値が NULL のときは、 \fBsystem\fP() はシェルが利用可能ならゼロ以外の値を返し、利用不可ならゼロを返す。
+最後の 2 つの場合、返り値は "wait status" であり、 \fBwaitpid\fP(2) に書かれているマクロ (つまり
+\fBWIFEXITED\fP() や \fBWEXITSTATUS\fP() などのマクロ) を使って検査することができる。
.PP
\fBsystem\fP() は他の子プロセスのウエイトステータスには影響を与えない。
.SH 準拠
C89, C99, POSIX.1\-2001.
.SH 注意
-.PP
-(「どの」ヘッダファイルをインクルードするよりも前に) 機能検査マクロ \fB_XOPEN_SOURCE\fP が定義された場合には、 \fBwait\fP(2)
-で説明されているマクロ群 (\fBWEXITSTATUS\fP() 等) が \fI<stdlib.h>\fP
+\fBsystem\fP() provides simplicity and convenience: it handles all of the
+details of calling \fBfork\fP(2), \fBexecl\fP(3), and \fBwaitpid\fP(2), as well as
+the necessary manipulations of signals; in addition, the shell performs the
+usual substitutions and I/O redirections for \fIcommand\fP. The main cost of
+\fBsystem\fP() is inefficiency: additional system calls are required to create
+the process that runs the shell and to execute the shell.
+
+(「どの」ヘッダファイルをインクルードするよりも前に) 機能検査マクロ \fB_XOPEN_SOURCE\fP が定義された場合には、
+\fBwaitpid\fP(2) で説明されているマクロ群 (\fBWEXITSTATUS\fP() 等) が \fI<stdlib.h>\fP
をインクルードすると利用可能になる。
.PP
既に述べたように、 \fBsystem\fP() は \fBSIGINT\fP と \fBSIGQUIT\fP を無視する。 よってループから \fBsystem\fP()
以降ではシェルのチェックを実行している。 なぜなら、呼び出し元のプログラムが \fBsystem\fP() を呼び出すより前に (POSIX.1\-2001
では規定されていない) \fBchroot\fP(2) を呼び出していた時には、シェルが利用可能でない場合や実行可能ファイル でない場合があるからである。
.PP
-実行したシェルコマンドが 127 (\fB/bin/sh\fP の呼び出しに失敗した時に返す値) を返すことも考えられる。 そのため、プログラムは
-(リターンコードを見るだけでは) \fBexecve\fP(2) の呼び出しが失敗したことを確実に知ることはできない。
+It is possible for the shell command to terminate with a status of 127,
+which yields a \fBsystem\fP() return value that is indistinguishable from the
+case where a shell could not be executed in the child process.
.SH 関連項目
-\fBsh\fP(1), \fBsignal\fP(2), \fBwait\fP(2), \fBexec\fP(3)
+\fBsh\fP(1), \fBsigaction\fP(2), \fBsigprocmask\fP(2), \fBfork\fP(2), \fBwait\fP(2),
+\fBexec\fP(3), \fBsignal\fP(7)
.SH この文書について
-この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.53 の一部
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.67 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man\-pages/ に書かれている。