.\" Copyright (c) 2006, 2014, Michael Kerrisk .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .\" .\" Japanese Version Copyright (c) 2006 Akihiro MOTOKI all rights reserved. .\" Translated 2006-07-31, Akihiro MOTOKI .\" Updated 2009-02-23, Akihiro MOTOKI , LDP v3.18 .\" .TH FEXECVE 3 2015\-01\-22 Linux "Linux Programmer's Manual" .SH 名前 fexecve \- ファイルディスクリプターで指定されたプログラムを実行する .SH 書式 .nf \fB#include \fP .sp \fBint fexecve(int \fP\fIfd\fP\fB, char *const \fP\fIargv\fP\fB[], char *const \fP\fIenvp\fP\fB[]);\fP .fi .sp .in -4n glibc 向けの機能検査マクロの要件 (\fBfeature_test_macros\fP(7) 参照): .in .sp \fBfexecve\fP(): .PD 0 .ad l .RS 4 .TP 4 glibc 2.10 以降: _XOPEN_SOURCE\ >=\ 700 || _POSIX_C_SOURCE\ >=\ 200809L .TP glibc 2.10 より前: _GNU_SOURCE .RE .ad .PD .SH 説明 .\" POSIX.1-2008 specifies the O_EXEC flag for open as an alternative, .\" but Linux doesn't support this flag yet. \fBfexecve\fP() は \fBexecve\fP(2) と同じ作業を行う。違うのは、 実行するファイルを、パス名ではなく、 ファイルディスクリプター \fIfd\fP を用いて指定する点である。 ファイルディスクリプター \fIfd\fP は、読み込み専用でオープンされていなければならず、 呼び出し元はファイルディスクリプターが参照するファイルに対する 実行許可を持っていなければならない。 .SH 返り値 \fBfexecve\fP() は呼び出しに成功した場合、戻ることはない。 エラーの場合、返り値 \-1 で関数が返り、 \fIerrno\fP が適切に設定される。 .SH エラー エラーは \fBexecve\fP(2) と同じだが、以下のエラーが追加になっている: .TP \fBEINVAL\fP \fIfd\fP が有効なファイルディスクリプターでない。または \fIargv\fP が NULL である。または \fIenvp\fP が NULL である。 .TP \fBENOSYS\fP \fI/proc\fP ファイルシステムにアクセスできなかった。 .SH バージョン \fBfexecve\fP() は glibc 2.3.2 以降で実装されている。 .SH 準拠 POSIX.1\-2008. この関数は POSIX.1\-2001 では規定されておらず、 他のシステムで広く利用できるわけではない。 POSIX.1\-2008 で規定されている。 .SH 注意 .\" FIXME . .\" With the addition of the execveat(2), fexecve() can be implemented .\" even where /proc is unavailable. Review future glibc releases to .\" see if the implementation is changed to use execveat(2). Linux では、 \fBfexecve\fP() は \fBproc\fP(5) ファイルシステムを使って実装されている。 そのため、この関数を呼び出す時点では \fI/proc\fP がマウントされて利用可能となっている必要がある。 \fBfexecve\fP() の裏にある考えは、呼び出し元が、ファイルを実行する前に実行ファイルの内容を検査 (チェックサムを確認) できるようにすることである。単に、ファイルをオープンして内容のチェックサムを検査し、それから \fBexecve\fP(2) を行うのは十分ではない。なぜなら、2 つのステップの間で、ファイル名や、パス名のディレクトリの前の方が入れ換えられる可能性があるからだ (例えば、シンボリックリンクのリンク先を変更するなど)。\fBfexecve\fP() は、チェックサムの検査と \fBfexecve\fP() の呼び出しの間で、ファイルの\fI内容\fPを変更できる可能性があるという問題への対策にはならない。この問題に対する対応策は、確実に、ファイルのアクセス許可を設定し、悪意のあるユーザーがファイルを変更できないようにすることである。 \fBfexecve\fP() を使用する際の理にかなった方法は、 \fIfd\fP に close\-on\-exec フラグをセットし、 実行するプログラムを通じてそのファイルディスクリプターが外部にもれないようにすることである。 この方法は 2 つの理由から理にかなっている。 1 つ目は、 これにより不必要にファイルディスクリプターが消費されるのを防ぐことができる (実行されるプログラムは普通プログラム自身が参照するファイルを参照する必要はない)。 2 つ目は、 \fBfexecve\fP() が再帰的に使用された場合、 close\-on\-exec フラグを利用することで、 再帰の各ステップで新しいプログラムに一つ余計にファイルディスクリプターが渡されることによる、 ファイルディスクリプターの枯渇を防ぐことができる (ただし「バグ」を参照)。 .SH バグ \fIfd\fP がスクリプトを参照していて (つまり、 最初の行に文字 \fI#!\fP で始まるスクリプトインタープリターの指示がある実行テキストファイルである)、 \fIfd\fP に close\-on\-exec フラグがセットされていた場合、 \fBfexecve\fP() はエラー \fBENOENT\fP で失敗する。 このエラーが起こるのは、 スクリプトインタープリターが実行される時点までに、 close\-on\-exec フラグにより \fIfd\fP がすでにクローズされてしまっているからである。 そのため、 スクリプトを参照する場合には、 close\-on\-exec フラグを \fIfd\fP にセットすることはできず、 「注意」の節で説明されている問題が起こり得る。 .SH 関連項目 \fBexecve\fP(2), \fBexecveat\fP(2) .SH この文書について この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man\-pages/ に書かれている。