.\" Copyright (c) 1991, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)exec.3 8.3 (Berkeley) 1/24/94 .\" %FreeBSD: src/lib/libc/gen/exec.3,v 1.7.2.7 2001/12/14 18:33:51 ru Exp % .\" .\" $FreeBSD$ .Dd January 24, 1994 .Dt EXEC 3 .Os .Sh 名称 .Nm execl , .Nm execlp , .Nm execle , .Nm exect , .Nm execv , .Nm execvp .Nd ファイルを実行する .Sh ライブラリ .Lb libc .Sh 書式 .In unistd.h .Vt extern char **environ ; .Ft int .Fn execl "const char *path" "const char *arg" ... .Ft int .Fn execlp "const char *file" "const char *arg" ... .Ft int .Fn execle "const char *path" "const char *arg" ... .Ft int .Fn exect "const char *path" "char *const argv[]" "char *const envp[]" .Ft int .Fn execv "const char *path" "char *const argv[]" .Ft int .Fn execvp "const char *file" "char *const argv[]" .Sh 解説 .Fn exec ファミリの関数は現在のプロセスイメージを新しいプロセスイメージで置き 換えます。 このマニュアルページで説明する関数は、関数 .Xr execve 2 のフロントエンドです (現在のプロセスの置き換えの詳細については、 .Xr execve 2 のマニュアルページを参照してください)。 .Pp これらの関数の初期引数は、実行されるファイルのパス名です。 .Pp .Fn execl , .Fn execlp , および .Fn execle の各関数の .Fa "const char *arg" および後続の省略記号は .Em arg0 , .Em arg1 , \&..., .Em argn と考えることができます。これらは実行された プログラムに利用できる引数リストを表す ナル文字で終わるストリングを指す 1 つまたは複数のポインタのリストを記述します。慣行で、最初の引数は、実行中の ファイルに対応するファイル名を指す必要があります。 引数のリストは .Dv NULL ポインタで終了させる .Em 必要があり ます。 .Pp .Fn exect , .Fn execv , および .Fn execvp の各関数は、新しいプログラムに利用できる引数リストを表す ナル文字で終わるストリングを指すポインタの配列を提供します。 慣行で、最初の引数は、実行中のファイルに対応するファイル名を 指す必要があります。 ポインタの配列は .Dv NULL ポインタで終了する .Sy 必要があり ます。 .Pp .Fn execle と .Fn exect の各関数も、実行されたプロセスの環境を指定します。 そのためには、パラメータリスト内にある引数リストを終了させる .Dv NULL ポインタ、または追加パラメータとともに argv 配列を指すポインタに従います。 この追加のパラメータは、ナル文字で終わるストリングを指すポインタの 配列であり、 .Dv NULL ポインタで終了される .Em 必要があり ます。 他の関数は、現在のプロセス内の外部変数 .Va environ から新しいプロセスイメージ用の環境を取り上げます。 .Pp これらの関数には特別な意味論のあるものもあります。 .Pp .Fn execlp と .Fn execvp の各関数は、指定されたファイル名にスラッシュ .Dq Li / が含まれていない場合、実行可能ファイルを検索してシェルの処置を複製します。 検索パスは .Dq Ev PATH 変数によって環境内で指定されたパスです。 この値が指定されない場合、 .Aq paths.h の .Dv _PATH_DEFPATH 定義に従い、デフォルトのパスが設定されます。 これは、 .Dq Ev /bin:/usr/bin: に設定されています。 さらに、特定のエラーが特別に取り扱われます。 .Pp エラーが曖昧な場合(簡単にするために、ここでは .Er ENOEXEC 以外のすべてのエラーを曖昧と考えます。ただし、致命的なエラー .Er EACCES だけが真に曖昧です)、 これらの関数は、ファイルを開始して、ファイルが存在するか、そして適切な実行 パーミッションがあるかを判定するかのように動作します。そうである場合、 これらの関数は .Fn execve によって設定された値に復元されたグローバル変数 .Va errno でただちに戻ります。 そうでない場合、検索が継続します。 検索が .Fn execve の実行に成功せず、またはエラーのために終了せずに完了すると、 これらの関数は、適切な実行パーミッションのある少なくとも 1 つのファイルが 見つかったかどうかに従って、グローバル変数 .Va errno を .Er EACCES または .Er ENOENT に設定して戻ります。 .Pp ファイルのヘッダが認識されない(試みた .Fn execve が .Er ENOEXEC を返した)場合、 これらの関数は、最初の引数としてファイルのパスがあるシェルを実行します (この試みが失敗した場合、それ以上の検索は行われません)。 .Pp .Fn exect 関数は、プログラムトレース機能を有効にしてファイルを実行します ( .Xr ptrace 2 を参照)。 .Pp .Sh 戻り値 .Fn exec 関数が戻った場合、エラーが発生しているはずです。 戻り値は \-1 であり、グローバル変数 .Va errno が設定されてエラーを示します。 .Sh ファイル .Bl -tag -width /bin/sh -compact /bin/sh シェル .El .Sh エラー .Fn execl , .Fn execle , .Fn execlp および .Fn execvp は処理失敗し、ライブラリ関数 .Xr execve 2 および .Xr malloc 3 について指定されたエラーを指定する .Va errno を設定する可能性があります。 .Pp .Fn exect と .Fn execv は、ライブラリ関数 .Xr execve 2 について指定されたエラーに 関して .Va errno を設定する可能性があります。 .Pp .Sh 関連項目 .Xr sh 1 , .Xr execve 2 , .Xr fork 2 , .Xr ktrace 2 , .Xr ptrace 2 , .Xr environ 7 .Sh 互換性 歴史的には .Fn execlp 関数と .Fn execvp 関数のデフォルトのパスは .Dq Pa :/bin:/usr/bin です。これが、システムセキュリティを向上させるために 現在のディレクトリを最後に配置するよう変更されました。 .Pp ファイルを実行しようとしている間にエラーが発生したときの .Fn execlp と .Fn execvp の動作は、あまり歴史的な慣行ではなく、従来から ドキュメント化されておらず、 .Tn POSIX 標準で指定されていません。 .Pp 従来、 .Fn execlp 関数と .Fn execvp 関数は、上記のもの、および .Er ETXTBSY , .Er ENOMEM と .Er E2BIG を除いてすべてのエラーを無視しました。 .Er ETXTBSY でこれらの関数は 数秒間、スリープした後で再試行し、 .Er ENOMEM と .Er E2BIG でこれらの関数は 返ります。 これらは現在 .Er ETXTBSY について戻り、存在と実行可能性をもっと注意深く判定します。 特に、パス接頭語内のアクセスできないディレクトリを表す .Er EACCES が、不適切な実行パーミッションのあるファイルについての .Er EACCES と混乱されないようになっています。 .Bx 4.4 で、これらの関数は、 .Er EACCES , .Er ENOENT , .Er ENOEXEC および .Er ETXTBSY 以外のすべてのエラーで戻りました。 これは従来のエラー処理より劣ったものでした。パス接頭語についてのエラーの 無視を破り、異常に曖昧なエラー .Er EFAULT と異常なエラー .Er EIO の処理を改良するだけだからです。 動作は .Xr sh 1 の動作と一致するように変更されました。 .Pp .Sh 規格 .Fn execl , .Fn execv , .Fn execle , .Fn execlp および .Fn execvp は .St -p1003.1-88 に準拠しています。