EXEC(3)

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

書式
#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[]);

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

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

関数 execl, execlp, execle の const char *arg とそれに続く引数は arg0, arg1, ..., argn. として考えられる。 これらには実行されるプログラムで利用可能な引数のリスト(最後が NULLで終わる1つ以上の文字列へのポインタ)を与える。 最初の引数は慣習により、実行されるファイル名 へのポインタにする。引数のリストは必ず NULL で終わらなければならない。

関数 execv と execvp は新しいプログラムで利用可能な引数リスト(最後がNULLで終わる1つ 以上の文字列へのポインタの配列)を与える。 最初の引数は慣習により実行されるファイル名へ のポインタにする。ポインタの配列は必ず NULL で終わらなければならない。

関数 execle ではプロセスの環境も指定する。環境は引数リスト(パラメータリストもしくは追加のパラメータ を持ったargv配列へのポインタ)の最後の NULL に続いて指定する。 追加のパラメータとは NULLで終わる文字列へのポインタの配列 であり NULL で終わらなければならない。他の関数は現在のプロセ スの外部変数 environ から新しいプロセス用の環境を与える。

これらの関数のいくつかは特別な記法を持っている。

関数 execlp と execvp はもし指定されたファイル名がスラッシュ(/) を含んでいない場合、実行可能なファイルの探索にシェルの行為 を真似る。 検索パスは環境変数 PATH で指定されたパスである。 もしこの変数が指定されていない場合、デフォルトPATHとして``:/ bin:/usr/bin''が使われる。さらに特定のエラーは特別 に扱われる。

もしファイルが実行ファイルでない場合(使われた execve は EACCES を返す)、これらの関数は残りの検索パスの検索を続ける。 他にファイルが見つからなくなった場合グローバル変数 errno に EACCES を設定しかえってくる。

ファイルのヘッダが実行形式として認識できない場合 (使われた execve は ENOEXEC を返す)、これらの関数はそのファイルを最初の引数としたシェル を実行する(この試みが失敗した場合、これ以上の検索は行われな い)。

返り値
もし exec ファミリーが返ってきた場合、エラーが発生している。 返り値は-1 で、グローバル変 errno にそのエラーの内容がセットされる。

ファイル
/bin/sh

エラー
これら全ての関数は失敗する場合がある。その場合ライブラリ関数 execve(2) によって指定されたエラーを errno に設定する。

関連
sh(1), execve(2), fork(2), environ(5), ptrace(2)

移植性
他のいくつかのコンピュータ上ではデフォルトPATH に /bin と /usr/bin の後にトロイの木馬対策として現在の作業ディレクトリを 加えている。 libc 5.4.7時点でLinuxはまだ "現在のディレクトリから探索する"という伝統的な デフォルトPATH を加えている。

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

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

準拠
Execl, execv, execle, execlp と execvp は IEEE Std1003.1-88 (``POSIX.1'') に準拠する。