Provided by: manpages-ja-dev_0.5.0.0.20210215+dfsg-1_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 がマウントされて利用可能となっている必要がある。 fexecve() の裏にある考えは、呼び出し元が、ファイルを実行する前に実行ファイルの内容を検査 (チェックサムを確認) できるようにすることである。単に、ファイルをオープンして内容のチェッ クサムを検査し、それから execve(2) を行うのは十分ではない。なぜなら、2 つのステップの間 で、ファイル名や、パス名のディレクトリの前の方が入れ換えられる可能性があるからだ (例え ば、シンボリックリンクのリンク先を変更するなど)。fexecve() は、チェックサムの検査と fexecve() の呼び出しの間で、ファイルの内容を変更できる可能性があるという問題への対策にはな らない。この問題に対する対応策は、確実に、ファイルのアクセス許可を設定し、悪意のあるユー ザーがファイルを変更できないようにすることである。 fexecve() を使用する際の理にかなった方法は、 fd に close-on-exec フラグをセットし、 実行す るプログラムを通じてそのファイルディスクリプターが外部にもれないようにすることである。 こ の方法は 2 つの理由から理にかなっている。 1 つ目は、 これにより不必要にファイルディスクリ プターが消費されるのを防ぐことができる (実行されるプログラムは普通プログラム自身が参照する ファイルを参照する必要はない)。 2 つ目は、 fexecve() が再帰的に使用された場合、 close-on-exec フラグを利用することで、 再帰の各ステップで新しいプログラムに一つ余計にファ イルディスクリプターが渡されることによる、 ファイルディスクリプターの枯渇を防ぐことができ る (ただし「バグ」を参照)。
バグ
fd がスクリプトを参照していて (つまり、 最初の行に文字 #! で始まるスクリプトインタープリ ターの指示がある実行テキストファイルである)、 fd に close-on-exec フラグがセットされていた 場合、 fexecve() はエラー ENOENT で失敗する。 このエラーが起こるのは、 スクリプトインター プリターが実行される時点までに、 close-on-exec フラグにより fd がすでにクローズされてし まっているからである。 そのため、 スクリプトを参照する場合には、 close-on-exec フラグを fd にセットすることはできず、 「注意」の節で説明されている問題が起こり得る。
関連項目
execve(2), execveat(2)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクト の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。