Provided by:
manpages-ja-dev_0.5.0.0.20070415-1_all 
前
execve - プログラムを実行する
式
#include <unistd.h>
int execve(const char *filename, char *const argv[],
char *const envp[]);
明
execve() は、filename によって指定されたプログラムを実行する。 filename
は、バイナリ実行形式か、"#! interpreter [arg]"
という形式の行で始まるスクリプトでなければならない。 後者の場合、inter-
preter は適切な実行ファイルのパス名でなければならず、
それ自身がスクリプトであってはならない。そして interpreter [arg] file-
name の形で呼び出される。
argv は新しいプログラムに渡される引た文字列の配列である。 envp
は文字列の配列であり、伝統的に key=value の形式を
しており、新しいプログラムの環曲竸瑤箸靴禿呂気譴襦 argv と envp
の両方とも NULL ポインタで終っている 必要がある。引た配列と環-
変数は呼び出されたプログラムの main 関数を int main(int argc, char
*argv[], char *envp[]) のように定義することによってアクセス可能になる。
成功した場合、execve() は返らない。 そして、呼び出し元のプロセスの
text, data, bss, スタックは、 読み込まれたプログラムによって上書-
される。
もし元のプログラムが ptrace されていると、execve() が成功した後に
そのプログラムに SIGTRAP が送られる。
filename で指定されたプログラムファイルに set-user-ID ビットが
設定されており、呼び出したプロセスが ptrace されていない場合、
呼び出したプロセスの実効 (effective) ユーザ ID は
プログラムファイルの所夕 (owner) に変更される。
同様に、プログラムファイルに set-group-ID ビットが設定されていた場合、
呼び出したプロセスの邑グループ ID は
プログラムファイルのグループに変更される。
プロセスの実効ユーザ ID は保存 (saved) set-user-ID にコピーされる。
同様に、実効グループ ID は保存 set-group-ID にコピーされる。
このコピーは、set-user-ID / set-group-ID 許可ビットにより発生する 実効
ID の変更後に行われる。
実行ファイルが動的リンクされた a.out 実行形式で、共優薀ぅ屮薀蠅
スタブを含むものだった場合、実行の開始時に Linux の
ダイナミック・リンカ ld.so(8) が呼び出され、必要な共-
ライブラリをメモリに読み込んでリンクを行う。
実行ファイルがダイナミック・リンクされた ELF 実行形式だった場合、
PT_INTERP セグメントに指定されたインタプリタが必要な 共優薀ぅ屮薀
(shared library) を読み込むのに使用される。
通常使用されるインタプリタは Linux libc version 5 をリンクしたバイナリ
の場合には /lib/ld-linux.so.1 が、GNU libc version 2 をリンクした
バイナリの場合には /lib/ld-linux.so.2 が使用される。
以下に示す以外のすべてのプロセス属世 execve() の前後で保持される。
* close-on-exec
の印が付いているファイルディスクリプタはクローズされる (fcntl(2) の
FD_CLOEXEC の説明を参照)。
* 処理待ち (pending) のシグナル集合はクリアされる (sigpending(2))。
* 捕捉されたシグナルの処理方法 (disposition)
は「無視」にリセットされる。
* 代替シグナルスタックはいずれも保持されない (sigaltstack(2))。
* メモリマッピングは保持されない (mmap(2))。
* 付加された (attached) System V 共優瓮皀螢札哀瓮鵐箸亙離される
(shmat(2))。
* POSIX 共優瓮皀衫琉茲魯泪奪團鵐阿魏鮟される (shm_open(3))。
* オープンされた POSIX メッセージゥ紂璽妊スクリプタはクローズされる
(mq_overview(7))。
* オープンされた POSIX 名前付ぅ札泪侫はいずれもクローズされる
(sem_overview(7))。
* POSIX タイマは保持されない (timer_create(3))。
* オープンされたディレクトリストリームはいずれもクローズされる
(opendir(3))。
* メモリロックは保持されない (mlock(2), mlockall(2))。
* 終了 (exit) ハンドラは保持されない (atexit(3), on_exit(3))。
上気離螢好箸離廛蹈札溝粟はいずれも POSIX.1-2001 で規定されている。
以下に示す Linux 固佑離廛蹈札溝粟も execve() の前後で保持されない。
* set-user-ID か set-group-ID されたプログラムが実行されている場合、
prctl(2) の PR_SET_DUMPABLE
フラグはクリアされる。それ以外の場合、このフラグはセットされる。
* prctl(2) の PR_SET_KEEPCAPS フラグはクリアされる。
* プロセス名は新しい実行ファイルの名前にリセットされる。 プロセス名は
prctl(2) の PR_SET_NAME で設定でぁ ps -o comm で表示でい襦
* 終了シグナル (termination signal) は SIGCHLD にリセットされる
(clone(2) 参照)。
以下の点についても注意すること:
* 呼び出し元スレッド以外の全てのスレッドは execve() 中に破棄される。
mutex、条件変数、その他の pthread オブジェクトは保持されない。
* setlocale(LC_ALL, "C") 相当の処理がプログラム開始時に実行される。
* POSIX.1-2001
は、動作が無視かデフォルトに設定されている全てのシグナル
の処理方法は変更せずそのままにする、と規定している。
但し、POSIX.1-2001 には一つ例外があり、SIGCHLD
が無視になっている場合、
その処理方法を変更せずにそのままにするか、デフォルト動作にリセットするかは
実装依存となっている。 Linux では前者 (変更しない) となっている。
* 完了していない非同期 I/O 操作はゥ礇鵐札襪気譴 (aio_read(3),
aio_write(3))。
* execve(2) 時のケーパビリティの扱いについては、 capabilities(7)
を参照。
値
成功すると execve() は返らない。エラーの場合は -1 を返し、 errno
を適当に設定する。
ー
E2BIG 環曲竸 (envp) と引た凜螢好 (argv) の合計バイト数が大げ瓩る。
EACCES filename やスクリプトインタプリタ名の構成要素に検索許可 (search
permission) が与えられていない (path_resolution(2)
も参照すること)。
EACCES ファイルもしくはスクリプトのインタプリタが通常ファイル (regular
file) でない。
EACCES ファイルやスクリプトや ELF インタプリタに 実行許可 (execute per-
mission) が与えられていない。
EACCES ファイル・システムが noexec でマウントされている。
EFAULT filename がアクセス可能なアドレス空間の外を指している。
EINVAL ELF 実行形式で複数の PT_INTERP セグメントが存在する。
(すなわち複数のインタプリタを指定した。)
EIO I/O エラーが発生した。
EISDIR ELF インタプリタがディレクトリだった。
ELIBBAD
ELF インタプリタが理解でい襯侫ーマットでなかった。
ELOOP filename やスクリプトや ELF のインタプリタを解決する際に遭遇した
シンボリック・リンクが多過ぎる。
EMFILE そのプロセスがオープンで-
るファイル数の上限まで既にオープンしている。
ENAMETOOLONG
filename が長過ぎる。
ENFILE そのシステムでオープンでい襯侫.ぅ訖瑤寮限に達した。
ENOENT ファイル filename かスクリプトや ELF
のインタプリタが存在しない。
ENOEXEC
実行ファイルが理解でい覆し措阿任△襪、違うアー-
テクチャのものか、 その他のフォーマット・エラーにより実行がで-
なかった。
ENOMEM カーネルに十分なメモリがない。
ENOTDIR
filename やスクリプトや ELF
のインタプリタの構成要素がディレクトリでない。
EPERM ファイル・システムが nosuid
でマウントされ、ユーザがスーパーユーザでなく、 ファイルに set-
user-ID あるいは set-group-ID ビットが設定されている。
EPERM プロセスがトレースされ、ユーザがスーパーユーザでなく、
ファイルに set-user-ID あるいは set-group-ID
ビットが設定されている。
ETXTBSY
実行ファイルを書すみ用にオープンしているプロセスがある。
拠
SVr4, 4.3BSD, POSIX.1-2001. POSIX.1-2001 には #! 動作についての-
述はないが、 他は互換世ある。
意
set-user-id プロセスと set-group-ID プロセスは ptrace() でい覆ぁ
Linux はスクリプトの set-user-ID と set-group-ID ビットを無視する。
ファイルシステムを nosuid でマウントした場合に set-user-ID/set-group-ID
の実行ファイルを どの様に扱うかは、Linux
カーネルのバージョンによって異なる:
あるバージョンでは、すでに必要な権限を持っている場合を除いて、
その実行を拒否する (そして EPERM を返す)。別のあるバージョンでは set-
user-ID/set-group-ID ビットのみを無視し exec() は成功する。
#! 実行形式のシェル・スクリプトの1行目に許されている文字数は、 最大
127 文字である。
Unix V6 では exec() コールの引た凜螢好箸 0 で終端され、 main の引-
数リストは -1 で終端されていた。 そのため、 main の引-
数リストは、その後の exec() コールには直接使用でい覆った。 Unix V7
以降では、ともに NULL で終端される。
chmod(2), fork(2), path_resolution(2), ptrace(2), execl(3), fexecve(3),
environ(7), ld.so(8).