Provided by: manpages-ja-dev_0.5.0.0.20070415-1_all bug
     前
        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).