Man page - system(3)

Packages contains this manual

Available languages:

en fr tr ja ru ro de

Manual

SYSTEM

名 前
書 式
説 明
返 り 値
エ ラ ー
属 性
準 拠
注 意
Caveats
関 連 項 目
こ の 文 書 に つ い て

名 前

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

書 式

#include <stdlib.h>

int system(const char * command );

説 明

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

execl("/bin/sh", "sh", "-c", command, (char *) NULL);

system () が 返 る の は コ マ ン ド が 完 了 し た 後 で あ る 。

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

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

返 り 値

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

*

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

*

If a child process could not be created, or its status could not be retrieved, the return value is -1 and errno is set to indicate the error.

*

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

*

シ ス テ ム コ ー ル が す べ て 成 功 し た 場 合 、 返 り 値 は command を 実 行 す る の に 使 用 さ れ た 子 プ ロ セ ス の シ ェ ル の 終 了 ス テ ー タ ス と な る (シ ェ ル の 終 了 ス テ ー タ ス は そ の シ ェ ル が 実 行 し た 最 後 の コ マ ン ド の 終 了 ス テ ー タ ス で あ る )。

最 後 の 2 つ の 場 合 、 返 り 値 は "wait status" で あ り 、 waitpid (2) に 書 か れ て い る マ ク ロ (つ ま り WIFEXITED () や WEXITSTATUS () な ど の マ ク ロ ) を 使 っ て 検 査 す る こ と が で き る 。

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

エ ラ ー

system () can fail with any of the same errors as fork (2).

属 性

こ の 節 で 使 用 さ れ て い る 用 語 の 説 明 に つ い て は 、 attributes (7) を 参 照 。

Image grohtml-45088-1.png

準 拠

POSIX.1-2001, POSIX.1-2008, C89, C99.

注 意

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

(「 ど の 」 ヘ ッ ダ ー フ ァ イ ル を イ ン ク ル ー ド す る よ り も 前 に ) 機 能 検 査 マ ク ロ _XOPEN_SOURCE が 定 義 さ れ た 場 合 に は 、 waitpid (2) で 説 明 さ れ て い る マ ク ロ 群 ( WEXITSTATUS () 等 ) が <stdlib.h> を イ ン ク ル ー ド す る と 利 用 可 能 に な る 。

既 に 述 べ た よ う に 、 system () は SIGINT SIGQUIT を 無 視 す る 。 よ っ て ル ー プ か ら system () を 呼 ぶ プ ロ グ ラ ム は 、 以 下 の 例 の よ う に 子 プ ロ セ ス の 終 了 状 態 を 自 分 で チ ェ ッ ク し て お か な い と 、 中 断 で き な く な る か も し れ な い 。

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

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

According to POSIX.1, it is unspecified whether handlers registered using pthread_atfork (3) are called during the execution of system (). In the glibc implementation, such handlers are not called.

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 () の 返 り 値 は 、 子 プ ロ セ ス で シ ェ ル が 実 行 で き な か っ た 場 合 と 区 別 で き な い 。

Caveats

Do not use system () from a privileged program (a set-user-ID or set-group-ID program, or a program with capabilities) because strange values for some environment variables might be used to subvert system integrity. For example, PATH could be manipulated so that an arbitrary program is executed with privilege. Use the exec (3) family of functions instead, but not execlp (3) or execvp (3) (which also use the PATH environment variable to search for an executable).

system () will not, in fact, work properly from programs with set-user-ID or set-group-ID privileges on systems on which /bin/sh is bash version 2: as a security measure, bash 2 drops privileges on startup. (Debian uses a different shell, dash (1), which does not do this when invoked as sh .)

Any user input that is employed as part of command should be carefully sanitized, to ensure that unexpected shell commands or command options are not executed. Such risks are especially grave when using system () from a privileged program.

関 連 項 目

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

こ の 文 書 に つ い て

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