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

名前
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/ に書かれている。
Linux 2014-04-20 FEXECVE(3)