EXEC(3)

名前
execl, execlp, execle, execv, execvp, execvpe - ファイルを実行する

書式
#include <unistd.h>

extern char **environ;

int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,
..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],
char *const envp[]);

glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):

execvpe(): _GNU_SOURCE

説明
exec() ファミリーの関数は現在のプロセスイメージを新しいプロセスイメージで置き 換える。このマニュアルで説明されている関数は execve(2) のフロントエンドである。 (現在のプロセスイメージの置き換えについての詳細は execve(2) のマニュアルを参照)

これらの関数の最初の引き数は、実行されるファイルの名前である。

関数 execl(), execlp(), execle() の const char *arg とそれに続く省略部分は arg0, arg1, ..., argn とみなされる。 これらには、実行されるプログラムで利用可能な引き数のリストを指定する (引き数のリストは ヌルで終端された文字列へのポインターから構成される)。 慣習として、最初の引き数は、実行されるファイル名 へのポインターにする。引き数のリストは必ず NULL で終わらなければならず、これらの関数は可変長引き数関数なので、 このポインターは (char *) NULL とキャストしなければならない。

関数 execv(), execvp(), execvpe() は、利用可能な引き数リスト (ヌルで終端された文字列への ポインターの配列) を新しいプログラムに渡す。 慣習として、最初の引き数は実行されるファイル名へ のポインターにする。ポインターの配列は必ず NULL で終わらなければならない。

関数 execle(), execvpe() では、呼び出し元が引き数 envp 経由実行されるプログラムの環境を指定することができる。 envp 引き数は、NULL で終端された文字列へのポインターの配列であり、ヌルポインターで終わらなければならない。 他の関数では、呼び出し元のプロセスの外部変数 environ から新しいプロセス用の環境を与える。

  execlp() と execvp() の特別な動作

関数 execlp(), execvp(), execvpe() は、指定されたファイル名がスラッシュ (/) を含んでいない場合、 シェルと同じ動作で実行可能なファイルを探索する。 ファイルの検索は、環境変数 PATH で指定されたコロン区切りのディレクトリのパス名のリストを対象に行われる。 この変数が定義されていない場合、パス名のリストのデフォルト値として、 カレントディレクトリの後ろに、 confstr(_CS_PATH) が返すディレクトリのリストをつなげた値が使用される (この confstr(3) の呼び出しでは通常 "/bin:/usr/bin" が返される)。 指定されたファイル名がスラッシュを含む場合、 PATH は無視され、指定されたパス名のファイルが実行される。 さらに、いくつかのエラーは特別に処理される。 ファイルが実行ファイルでない場合 (このとき呼び出そうとした execve(2) はエラー EACCES で失敗する)、これらの関数は残りの検索パスの検索を続ける。 他にファイルが見つからなくなった場合 errno に EACCES を設定し復帰する。 ファイルのヘッダーが実行形式として認識できない場合 (このとき呼び出そうとした execve(2) はエラー ENOEXEC で失敗する)、これらの関数はそのファイルを最初の引き数としたシェル (/bin/sh) を実行する (これにも失敗した場合、これ以上の検索は行われない)。

返り値
exec() 群の関数が復帰するのは、エラーが発生した場合のみである。 返り値は -1 で、 errno にエラーの内容がセットされる。

エラー
これら全ての関数は失敗する場合がある。その場合、 execve(2) に対して規定されたエラーが errno に設定される。

バージョン
execvpe() 関数は glibc 2.11 で初めて登場した。

準拠
POSIX.1-2001, POSIX.1-2008. execvpe() 関数は GNU による拡張である。

注意
Linux 以外のシステムには、 (環境変数 PATH が定義されていないときの) デフォルトのパスにおいて、カレントディレクトリが /bin と /usr/bin の後ろに配置されるものもある。 これはトロイの木馬対策のためである。 Linux では、デフォルトのパスに、昔ながらの「現在のディレクトリを 先に探索」というルールを使っている。

ファイルを実行しようとしている間にエラーが発生した時の execlp() と execvp() のふるまいについて歴史的な慣習はあるが、伝統的に文書として記載されておらず、 POSIX 標準でも規定されていない。BSD (またおそらく他のシステム) では、 ETXTBSY が発生した場合、自動的に中断 (sleep) し再試行を行う。 Linux はそれをハードエラーとして取り扱い即座に復帰する。

伝統的に、関数 execlp() と execvp() は、上で説明したエラーと、これら 2 つの関数自身が返す ENOMEM と E2BIG 以外の全てのエラーを無視していたが、 今では、上で説明した以外のエラーが発生した場合でも、 返ってくるよう変更された。

関連項目
sh(1), execve(2), execveat(2), fork(2), ptrace(2), fexecve(3), environ(7)

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