Manpages

名 前

system − シ ェ ル コ マ ン ド の 実 行

書 式

#include <stdlib.h>

int system(const char *command);

説 明

system() ラ イ ブ ラ リ 関 数 は 、 fork(2) を 使 っ て 子 プ ロ セ ス を 作 成 し 、 そ の 子 プ ロ セ ス は 以 下 の よ う に command で 指 定 さ れ た シ ェ ル コ マ ン ド を execl(3) を 使 っ て 実 行 す る 。

execl("/bin/sh", "sh", "−c", command, (char *) 0);

system() が 返 る の は コ マ ン ド が 完 了 し た 後 で あ る 。 コ マ ン ド の 実 行 中 は 、 system() を 呼 び 出 し た プ ロ セ ス で は 、 SIGCHLD は ブ ロ ッ ク さ れ 、 SIGINTSIGQUIT は 無 視 さ れ る (command を 実 行 す る 子 プ ロ セ ス で は 、 こ れ ら の シ グ ナ ル は デ フ ォ ル ト の 処 理 方 法 に し た が っ て 処 理 さ れ る )。

command が NULL の 場 合 、 system() は そ の シ ス テ ム で シ ェ ル が 利 用 可 能 か を 示 す ス テ ー タ ス を 返 す 。

返 り 値

system() の 返 り 値 は 以 下 の い ず れ か で あ る 。

*

command が NULL の 場 合 、 シ ェ ル が 利 用 可 能 な ら ゼ ロ 以 外 の 値 、 利 用 不 可 な ら 0。

*

子 プ ロ セ ス を 作 成 で き な か っ た 場 合 、 ま た は 子 プ ロ セ ス の ス テ ー タ ス を 取 得 で き な か っ た 場 合 、 返 り 値 は −1 で あ る 。

* 子 プ ロ セ ス で シ ェ ル を 実 行 で き

な か っ た 場 合 、 返 り 値 は 子 プ ロ セ ス が ス テ ー タ ス 127 で _exit(2) を 呼 び 出 し て 終 了 し た の と 同 じ に な る 。

* シ ス テ ム コ

ー ル が す べ て 成 功 し た 場 合 、 返 り 値 は command を 実 行 す る の に 使 用 さ れ た 子 プ ロ セ ス の シ ェ ル の 終 了 ス テ ー タ ス と な る (シ ェ ル の 終 了 ス テ ー タ ス は そ の シ ェ ル が 実 行 し た 最 後 の コ マ ン ド の 終 了 ス テ ー タ ス で あ る )。 最 後 の 2 つ の 場 合 、 返 り 値 は "wait status" で あ り 、 waitpid(2) に 書 か れ て い る マ ク ロ (つ ま り WIFEXITED() や WEXITSTATUS() な ど の マ ク ロ ) を 使 っ て 検 査 す る こ と が で き る 。

system() は 他 の 子 プ ロ セ ス の ウ エ イ ト ス テ ー タ ス に は 影 響 を 与 え な い 。

属 性

マ ル チ ス レ ッ デ ィ ン グ (pthreads(7) 参 照 ) 関 数 system() は ス レ ッ ド セ ー フ で あ る 。

準 拠

C89, C99, POSIX.1−2001.

注 意

system() に よ り 簡 便 性 と 利 便 性 が も た ら さ れ る 。 こ の 関 数 は fork(2), execl(3), waitpid(2) の 呼 び 出 し に お け る 詳 細 を す べ て 行 う と と も に 、 シ グ ナ ル の 適 切 な 処 理 も 行 う 。 ま た 、 シ ェ ル は command に 対 し て 通 常 の 置 換 (substitutions) と I/O リ ダ イ レ ク ト を 行 う 。 system() を 使 用 す る こ と に よ る 主 な コ ス ト は 非 効 率 性 で あ る 。 シ ェ ル を 実 行 す る プ ロ セ ス を 作 成 す る た め と そ の シ ェ ル を 実 行 す る た め に 、 余 計 に シ ス テ ム コ ー ル が 必 要 と な る 。

(「 ど の 」 ヘ ッ ダ ー フ ァ イ ル を イ ン ク ル ー ド す る よ り も 前 に ) 機 能 検 査 マ ク ロ _XOPEN_SOURCE が 定 義 さ れ た 場 合 に は 、 waitpid(2) で 説 明 さ れ て い る マ ク ロ 群 (WEXITSTATUS() 等 ) が <stdlib.h> を イ ン ク ル ー ド す る と 利 用 可 能 に な る 。 既 に 述 べ た よ う に 、 system() は SIGINTSIGQUIT を 無 視 す る 。 よ っ て ル ー プ か ら system() を 呼 ぶ プ ロ グ ラ ム は 、 以 下 の 例 の よ う に 子 プ ロ セ ス の 終 了 状 態 を 自 分 で チ ェ ッ ク し て お か な い と 、 中 断 で き な く な る か も し れ な い 。

while (something) {
int ret = system("foo");

if (WIFSIGNALED(ret) &&
(WTERMSIG(ret) == SIGINT || WTERMSIG(ret) == SIGQUIT))
break; }

set−user−ID や set−group−ID の 特 権 を も つ プ ロ グ ラ ム の 中 で は system() を 使 っ て は い け な い 。 な ぜ な ら 、 あ る 環 境 変 数 の 未 知 の 値 に よ っ て シ ス テ ム の 安 全 が 損 な わ れ る か ら で あ る 。 代 わ り に exec(3) 関 連 の 関 数 群 の 中 で execlp(3)execvp(3) 以 外 の 関 数 を 使 用 す べ き で あ る 。 実 際 の と こ ろ 、 system() は /bin/sh が bash バ ー ジ ョ ン 2 で あ る シ ス テ ム で は 、 set−user−ID や set−group−ID の 特 権 を 持 つ プ ロ グ ラ ム か ら は 正 し く 動 作 し な い 。 な ぜ な ら 、 bash バ ー ジ ョ ン 2 は ス タ ー ト ア ッ プ 時 に 特 権 を 落 と す か ら で あ る 。 (Debian で は 、 sh と し て 起 動 さ れ た 時 に は こ の よ う な 動 作 を 行 な わ な い よ う に 修 正 さ れ た bash を 用 い て い る )

glibc 2.1.3 よ り 前 の バ ー ジ ョ ン で は 、 command が NULL の 場 合 に /bin/sh が 利 用 可 能 か ど う か の チ ェ ッ ク は 実 際 に は 行 わ ず 、 い つ で も 利 用 可 能 で あ る と み な し て い た 。 system() は こ の 場 合 に 常 に 1 を 返 し て い た 。 POSIX.1−2001 で は シ ェ ル が 提 供 さ れ て い る と い う 標 準 に 準 拠 し た 実 装 を 要 求 し て い る が 、 glibc 2.1.3 以 降 で は シ ェ ル の チ ェ ッ ク を 実 行 し て い る 。 な ぜ な ら 、 呼 び 出 し 元 の プ ロ グ ラ ム が system() を 呼 び 出 す よ り 前 に (POSIX.1−2001 で は 規 定 さ れ て い な い ) chroot(2) を 呼 び 出 し て い た 時 に は 、 シ ェ ル が 利 用 可 能 で な い 場 合 や 実 行 可 能 フ ァ イ ル で な い 場 合 が あ る か ら で あ る 。 シ ェ ル コ マ ン ド が ス テ ー タ ス 127 で 終 了 す る こ と も あ る 。 こ の 場 合 、 system() の 返 り 値 は 、 子 プ ロ セ ス で シ ェ ル が 実 行 で き な か っ た 場 合 と 区 別 で き な い 。

関 連 項 目

sh(1), sigaction(2), sigprocmask(2), fork(2), wait(2), exec(3), signal(7)

こ の 文 書 に つ い て

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