EXEC(3)

名称
execl, execlp, execle, exect, 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, ...) 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[])

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

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

execl(), execlp(), および execle() の各関数の const char *arg および後続の省略記号は arg0, arg1, ..., argn と考えることができます。これらは実行された プログラムに利用できる引数リストを表す ナル文字で終わるストリングを指す 1 つまたは複数のポインタのリストを記述します。慣行で、最初の引数は、実行中の ファイルに対応するファイル名を指す必要があります。 引数のリストは NULL ポインタで終了させる 必要があり ます。

exect(), execv(), および execvp() の各関数は、新しいプログラムに利用できる引数リストを表す ナル文字で終わるストリングを指すポインタの配列を提供します。 慣行で、最初の引数は、実行中のファイルに対応するファイル名を 指す必要があります。 ポインタの配列は NULL ポインタで終了する 必要があり ます。

execle() と exect() の各関数も、実行されたプロセスの環境を指定します。 そのためには、パラメータリスト内にある引数リストを終了させる NULL ポインタ、または追加パラメータとともに argv 配列を指すポインタに従います。 この追加のパラメータは、ナル文字で終わるストリングを指すポインタの 配列であり、 NULL ポインタで終了される 必要があり ます。 他の関数は、現在のプロセス内の外部変数 environ から新しいプロセスイメージ用の環境を取り上げます。

これらの関数には特別な意味論のあるものもあります。

execlp() と execvp() の各関数は、指定されたファイル名にスラッシュ “/” が含まれていない場合、実行可能ファイルを検索してシェルの処置を複製します。 検索パスは “PATH” 変数によって環境内で指定されたパスです。 この値が指定されない場合、デフォルトのパス “/bin:/usr/bin:” が使用されます。 さらに、特定のエラーが特別に取り扱われます。

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

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

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

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

ファイル
/bin/sh シェル

エラー
execl(), execle(), execlp() および execvp() は処理失敗し、ライブラリ関数 execve(2) および malloc(3) について指定されたエラーを指定する errno を設定する可能性があります。

exect() と execv() は、ライブラリ関数 execve(2) について指定されたエラーに 関して errno を設定する可能性があります。

関連項目
sh(1), execve(2), fork(2), ktrace(2), ptrace(2), environ(7).

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

ファイルを実行しようとしている間にエラーが発生したときの execlp() と execvp() の動作は、あまり歴史的な慣行ではなく、従来から ドキュメント化されておらず、 POSIX 標準で指定されていません。

従来、 execlp() 関数と execvp() 関数は、上記のもの、および ETXTBSY, ENOMEM と E2BIG を除いてすべてのエラーを無視しました。 ETXTBSY でこれらの関数は 数秒間、スリープした後で再試行し、 ENOMEM と E2BIG でこれらの関数は 返ります。 これらは現在 ETXTBSY について戻り、存在と実行可能性をもっと注意深く判定します。 特に、パス接頭語内のアクセスできないディレクトリを表す EACCES が、不適切な実行パーミッションのあるファイルについての EACCES と混乱されないようになっています。 4.4BSD で、これらの関数は、 EACCES, ENOENT, ENOEXEC および ETXTBSY 以外のすべてのエラーで戻りました。 これは従来のエラー処理より劣ったものでした。パス接頭語についてのエラーの 無視を破り、異常に曖昧なエラー EFAULT と異常なエラー EIO の処理を改良するだけだからです。 動作は sh(1) の動作と一致するように変更されました。

規格
execl(), execv(), execle(), execlp() および execvp() は p1003.1-88 に準拠しています。