EXEC(3) FreeBSD ライブラリ関数マニュアル EXEC(3)
名称
execl, execlp, execle, exect, execv, execvp − ファイルを実行する |
ライブラリ
標準 C ライブラリ (libc, −lc) |
書式
#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’’ 変数によって環境内で指定されたパスです。この値が 指定されない場合、 〈paths.h〉 の _PATH_DEFPATH 定義に従い、デフォルトのパ スが設定されます。これは、 ‘‘/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 を設定する可能性があります。 |
関連項目
互換性
歴史的には 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() は IEEE Std 1003.1-1988 (‘‘POSIX.1’’) に準拠しています。 FreeBSD 10.0 January 24, 1994 FreeBSD 10.0 |