EXECVE(2)

名前
execve - プログラムを実行する

書式
#include <unistd.h>

int execve (const char *filename, char *const argv [], char *const envp[]);

説明
execve() は，filename によって指定されたプログラムを実行する。 filename は，バイナリ実行形式か，"#! interpreter [arg]" という形式の行で始まるスクリプトでなければならない。 後者の場合、interpreter は適切な実行ファイルのパス名でなければならず、 それ自身がスクリプトであってはならない。そしてそれは interpreter [arg] filename の形で呼び出される。 成功した場合、execve() は返らない。 そして，呼び出し元のプロセスの text, data, bss, スタックは，読み込まれ たプログラムによって上書きされる。 呼び出されたプログラムは、呼び出し元の PID および exec 時クローズ(close on exec)の設定されていないすべての ファイル・ディスクリプターを継承する。 親プロセスでの保留シグナルは解除される。呼び出し元のプログラムで 設定されたシグナル捕獲時の動作はデフォルト動作に戻される。 もし元のプログラムが ptrace されていると，execve() が成功し た後にそのプログラムに SIGTRAP が送られる。 実行ファイルがダイナミック・リンクされた ELF 実行形式だった場合、 PT_INTERP セグメントに指定されたインタプリターが必要な 共有ライブラリ(shared library)を読み込むのに使用される。 通常使用されるインタープリターは Linux libc version 5 をリンクしたバイナリ の場合には /lib/ld-linux.so.1 が、GNU libc version 2 をリンクした バイナリの場合には /lib/ld-linux.so.2 が使用される。

返り値
成功すると execve() は返らない。エラーの場合は -1 を返し、 errno を適当に設定する。

エラー

EACCES
    ファイルかスクリプトのインタプリターが普通のファイルでない。

EACCES
    ファイルかスクリプトのインタプリターに実行許可(execute permission)が 与えられていない。

EPERM
    ファイル・システムが noexec でマウントされている。

EPERM
    ファイル・システムが nosuid でマウントされ，ファイルに SUID あるいは SGID ビットが設定されている。

E2BIG
    引き数リストが大き過ぎる。

ENOEXEC
    実行ファイルが理解できない形式であるか、違うアキテクチャーのものか、 その他のフォーマット・エラーにより実行ができなかった。

EFAULT
    filename がアクセス可能なアドレス空間の外を指している。

ENAMETOOLONG
    filename が長過ぎる。

ENOENT
    ファイル filename かスクリプトや ELF のインタプリターが存在しない。

ENOMEM
    カーネルに十分なメモリがない。

ENOTDIR
    filename やスクリプトや ELF のインタプリターの構成要素がディレクトリでない。

EACCES
    filename やスクリプトや ELF のインタプリターの構成要素に検索許可(search permission) が与えられていない。

ELOOP
    filename やスクリプトや ELF のインタプリターを解決する際に遭遇した シンボリック・リンクが多過ぎる。

ETXTBUSY
    実行ファイルを書き込み用にオープンしているプロセスがある。

EIO I/O エラーが発生した。

ENFILE
    そのシステムでオープンできるファイル数の限界に達っした。

EMFILE
    そのプロセスがオープンできるファイル数の上限まで既にオープンしている。

EINVAL
    ELF 実行形式で複数の PT_INTERP セグメントが存在する。 (すなわち複数のインタプリターを指定した。)

EISDIR
    ELF インタプリターがディレクトリだった。

ELIBBAD
    ELF インタプリターが理解できるフォーマットでなかった。

準拠
SVr4, SVID, X/OPEN, BSD 4.3. POSIX には #! 動作についての記述は ないが他は互換性がある。SVr4 には他に EAGAIN, EINTR, ELIBACC, ENOLINK, EMULTIHOP についての記述がある。POSIX には ETXTBSY, EPERM, EFAULT, ELOOP, EIO, ENFILE, EMFILE, EINVAL, EISDIR, ELIBBAD エラー状態について の記述はない。

注意
SUID と SGID プロセスは，それぞれ SUID, SGID として ptrace() できない。 #! 実行形式のシェル・スクリプトの１行目には最大 127 文字が許されている。 Linux はスクリプトの SUID ビットと SGID ビットを無視する。

関連項目
ld.so(8), execl(3), fork(2)