SYSTEM(3)

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

書式
#include <stdlib.h>

int system (const char * string);

説明
system() は string で指定したコマンドを /bin/sh -c string の形で実行する。指定したコマンドが終了すればこの関数も終了する。 コマンド実行中は SIGCHLD はブロックされ、 SIGINT と SIGQUIT は無視される。

返り値
execve() が /bin/sh を呼び出すのに失敗した時には 127 を、別のエラーがあった時には -1 を、 それ以外の時はコマンドの返り値を返す。

string の値が NULL のときは、 system() はシェルが利用可能ならゼロ以外の値を返し、利用不可ならゼロを返す。

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

準拠
ANSI C, POSIX.1, 進行中のPOSIX.2, BSD 4.3

バグ

suid や sgid の特権をもつプログラムの中では system() を使ってはいけない。なぜなら、ある環境変数の未知の値によって システムの安全が損なわれるからである。代わりに exec(2) 関連の関数群の中で execlp(2) と execvp(2) 以外の関数を使用すべきである。

/bin/sh が利用可能かどうかのチェックは実際には行わない。 いつでも利用可能であると仮定している。

実行したシェルコマンドが 127 ( /bin/sh の呼び出しに失敗した時に返す値)を返すこともかんがえられる。 そのため、プログラムは(リターンコードを見るだけでは) execve() の呼び出しが失敗したことを確実に知ることはできない。 確実に知るためには errno をチェックするべきである。

関連項目
sh(1), exec(2), signal(2)