Provided by: manpages-ja-dev_0.5.0.0.20140515+dfsg-2_all bug

名前

       fexecve - ファイルディスクリプタで指定されたプログラムを実行する

書式

       #include <unistd.h>

       int fexecve(int fd, char *const argv[], char *const envp[]);

   glibc 向けの機能検査マクロの要件 (feature_test_macros(7)  参照):

       fexecve():
           glibc 2.10 以降:
               _XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
           glibc 2.10 より前:
               _GNU_SOURCE

説明

       fexecve()  は execve(2)  と同じ作業を行う。違うのは、 実行するファイルを、パス名ではなく、
       ファイルディスクリプタ fd を用いて指定する点である。 ファイルディスクリプタ fd  は、読み込
       み専用でオープンされていなければならず、  呼び出し元はファイルディスクリプタが参照するファ
       イルに対する 実行許可を持っていなければならない。

返り値

       fexecve()  は呼び出しに成功した場合、戻ることはない。 エラーの場合、返り値  -1  で関数が返
       り、 errno が適切に設定される。

エラー

       エラーは execve(2)  と同じだが、以下のエラーが追加になっている:

       EINVAL fd が有効なファイルディスクリプタでない。または argv が NULL である。または envp が
              NULL である。

       ENOSYS /proc ファイルシステムにアクセスできなかった。

バージョン

       fexecve()  は glibc 2.3.2 以降で実装されている。

準拠

       POSIX.1-2008.  この関数は POSIX.1-2001 では規定されておらず、 他のシステムで広く利用できる
       わけではない。 POSIX.1-2008 で規定されている。

注意

       Linux  では、 fexecve()  は proc(5)  ファイルシステムを使って実装されている。 そのため、こ
       の関数を呼び出す時点では /proc がマウントされて利用可能となっている必要がある。

       fd がインタプリタスクリプトを参照するファイルディスクリプタで、 close-on-exec がセットされ
       ていた場合  (fcntl(2) の FD_CLOEXEC の議論を参照)、 fexecve() はスクリプトの実行に失敗する
       ことになる。ならなら、スクリプトインタプリタがスクリプトファイルにアクセスしようとするとき
       には、 fd はすでにクローズされているからである。

       fexecve()   の裏にある考えは、呼び出し元が、ファイルを実行する前に実行ファイルの内容を検査
       (チェックサムを確認)  できるようにすることである。単に、ファイルをオープンして内容のチェッ
       クサムを検査し、それから  execve(2)  を行うのは十分ではない。なぜなら、2  つのステップの間
       で、ファイル名や、パス名のディレクトリの前の方が入れ換えられる可能性があるからだ     (例え
       ば、シンボリックリンクのリンク先を変更するなど)。fexecve()        は、チェックサムの検査と
       fexecve() の呼び出しの間で、ファイルの内容を変更できる可能性があるという問題への対策にはな
       らない。この問題に対する対応策は、確実に、ファイルのアクセス許可を設定し、悪意のあるユー
       ザーがファイルを変更できないようにすることである。

関連項目

       execve(2)

この文書について

       この man ページは Linux man-pages プロジェクトのリリース 3.65 の一部  である。プロジェクト
       の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。