exec

Autres langues

Langue: ja

Version: 1993-11-29 (fedora - 25/11/07)

Section: 3 (Bibliothèques de fonctions)

名前

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(2) のマニュアルを参照)

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

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

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

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

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

関数 execlp() と execvp() は、指定されたファイル名がスラッシュ (/) を含んでいない場合、 シェルと同じ動作で実行可能なファイルを探索する。 検索パスは環境変数 PATH で指定されたパスである。 この変数が指定されていない場合、デフォルトPATHとして ``:/bin:/usr/bin'' が使用される。 また、いくつかのエラーが発生した場合の扱いが特殊である。

もしファイルが実行ファイルでない場合 (このとき呼び出そうとした execve(2) は EACCES を返す)、これらの関数は残りの検索パスの検索を続ける。 他にファイルが見つからなくなった場合グローバル変数 errnoEACCES を設定し復帰する。

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

返り値

もし exec() ファミリーが復帰してきた場合、エラーが発生している。 返り値は -1 で、大域変数 errno にそのエラーの内容がセットされる。

エラー

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

準拠

POSIX.1-2001.

注意

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

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

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

関連項目

sh(1), execve(2), fork(2), ptrace(2), fexecve(3), environ(7)