EN JA
EXEC(3)
EXEC(3) FreeBSD Library Functions Manual EXEC(3)

名称

execl, execlp, execle, exect, execv, execvp, execvPファイルを実行する

ライブラリ

Standard C Library (libc, -lc)

書式

#include < unistd.h>

extern char **environ;

int
execl( const char *path, const char *arg, ..., /*, (char *)0, */);

int
execlp( const char *file, const char *arg, ..., /*, (char *)0, */);

int
execle( const char *path, const char *arg, ..., /* (char *)0 char *const envp[] */);

int
exect( const char *path, char *const argv[], char *const envp[]);

int
execv( const char *path, char *const argv[]);

int
execvp( const char *file, char *const argv[]);

int
execvP( const char *file, const char *search_path, char *const argv[]);

解説

exec 関数ファミリは、現在のプロセスイメージを新しいプロセスイメージで置き換えます。このマニュアルページに記述された関数は、関数 execve(2) のフロントエンドです。 (現在のプロセスの置き換えについての詳細な情報は、 execve(2) のマニュアルページを参照してください。)

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

execl(), execlp() と execle() の関数の const char *arg と続く省略は arg0, arg1, ..., argn と考えることができます。これらは実行されたプログラムに利用できる引数リストを表すヌル文字で終了する文字列を指す 1 つ以上のポインタのリストを記述します。慣例により、最初の引数は、実行中のファイルに関連したファイル名を指すべきです。引数のリストは NULL ポインタで終了されなければなりません。

exect(), execv(), execvp() と execvP() の各関数は、新しいプログラムに利用できる引数リストを表すヌル文字で終了する文字列を指すポインタの配列を提供します。慣例により、最初の引数は、実行されているファイルに関連したファイル名を指すべきです。ポインタの配列は NULL ポインタで終了して いなければ なりません。

execle() と exect() 関数は、引数リスト中の引数リストを終了させる NULL ポインタか追加引数の argv 配列のポインタが続く実行されたプロセスの環境を指定します。この追加の引数は、ヌル文字で終了する文字列を指すポインタの配列であり、 NULL ポインタで終了され なければ なりません。他の関数は、現在のプロセス内の外部変数 environ から新しいプロセスイメージ用の環境を取得します。

これらの関数のいくつかは特別な意味を持っています。

関数 execlp(), execvp() と execvP() は、指定されたファイル名にスラッシュ“ /”が含まれていない場合、実行形式ファイルを検索してシェルの動作を複製します。 execlp() と execvp() の検索パスは“ PATH”変数によって環境内で指定されたパスです。この変数が指定されない場合、デフォルトのパスは、 < paths.h> 中の _PATH_DEFPATH 定義 (これは、“ /usr/bin:/bin”に設定されています) に従い設定されます。 execvP() の検索パスは、関数への引数によって指定されます。さらに、あるエラーは特別に取り扱われます。

エラーが曖昧な場合 (簡単にするために、ここでは ENOEXEC 以外のすべてのエラーを曖昧と考えます。ただし、致命的なエラー EACCES だけが真に曖昧です)、これらの関数は、ファイルが存在するか、そして適切な実行パーミッションがあるかを決定するファイルを提示するかのように動作します。そうである場合、これらの関数は execve() によって設定された値に復元されたグローバル変数 errno でただちに戻ります。そうでない場合、検索が継続します。検索が execve() の実行に成功せず、またはエラーのために終了せずに完了すると、これらの関数は、適切な実行パーミッションのある少なくとも 1 つのファイルが見つかったかどうかに従って、グローバル変数 errnoEACCES または ENOENT に設定して戻ります。

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

exect() 関数は、プログラムトレース機能を有効にしてファイルを実行します ( ptrace(2) を参照)。

戻り値

exec() 関数のどれかが戻った場合、エラーが発生しているはずです。戻り値は-1 であり、グローバル変数 errno にエラーを示す値が設定されます。

関連ファイル

/bin/sh
シェル。

互換性

歴史的には execlp() 関数と execvp() 関数のデフォルトのパスは“ :/bin:/usr/bin”です。システムセキュリティを向上させるために現在のディレクトリを最後に配置するよう変更されました。

ファイルを実行を試みる間にエラーが発生した場合の execlp() と execvp() の振る舞いは、まったく歴史的な慣行ではなく、もともと文書化されておらず、 POSIX 標準でも明記されていません。

伝統的に、関数 execlp() と execvp() は、上で説明されたものと数秒間スリープした後で再試行する ETXTBSY とそれらが返えされる ENOMEME2BIG を除いてすべてのエラーを無視しました。これらは今 ETXTBSY のために返り、存在と実行可能性をもっと注意深く判定します。特に、パス接頭辞内のアクセスできないディレクトリのための EACCES は、もはや不適切な実行パーミッションのあるファイルのための EACCES と混乱されません。 4.4BSD で、これらは、 EACCES, ENOENT, ENOEXECETXTBSY を除いてすべてのエラーで返ります。これは、パス接頭辞のためのエラーの無視を中断するので、これは従来のエラー処理より劣ったものであり、異常で曖昧なエラー EFAULT と異常なエラー EIO の操作のみを改良します。動作は sh(1) の動作と一致するように変更されました。

エラー

execl(), execle(), execlp(), execvp() と execvP() 関数は、失敗し、ライブラリ関数 execve(2)malloc(3) で明記されたエラーのいずれかが errno に設定されます。

exect() と execv() 関数は、ライブラリ関数 execve(2) で明記されたエラーのいずれかが errno に設定されます。

規格

execl(), execv(), execle(), execlp() と execvp() 関数は IEEE Std 1003.1-1988 (“POSIX.1”) に適合しています。 execvP() 関数は FreeBSD 5.2 ではじめて登場しました。
January 24, 1994 FreeBSD