OSDN Git Service

Update README
[linuxjm/LDP_man-pages.git] / release / man3 / fexecve.3
index 0215469..119dba2 100644 (file)
@@ -1,4 +1,4 @@
-.\" Copyright (c) 2006, Michael Kerrisk
+.\" Copyright (c) 2006, 2014, Michael Kerrisk
 .\"
 .\" %%%LICENSE_START(VERBATIM)
 .\" Permission is granted to make and distribute verbatim copies of this
@@ -32,9 +32,9 @@
 .\" Translated 2006-07-31, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
 .\" Updated 2009-02-23, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>, LDP v3.18
 .\"
-.TH FEXECVE 3 2014\-04\-20 Linux "Linux Programmer's Manual"
+.TH FEXECVE 3 2015\-01\-22 Linux "Linux Programmer's Manual"
 .SH 名前
-fexecve \- ファイルディスクリプタで指定されたプログラムを実行する
+fexecve \- ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81§æ\8c\87å®\9aã\81\95ã\82\8cã\81\9fã\83\97ã\83­ã\82°ã\83©ã\83 ã\82\92å®\9fè¡\8cã\81\99ã\82\8b
 .SH 書式
 .nf
 \fB#include <unistd.h>\fP
@@ -62,9 +62,9 @@ _GNU_SOURCE
 .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 は、読み込み専用でオープンされていなければならず、
-呼び出し元はファイルディスクリプタが参照するファイルに対する 実行許可を持っていなければならない。
+\fBfexecve\fP()  は \fBexecve\fP(2)  と同じ作業を行う。違うのは、 実行するファイルを、パス名ではなく、 ファイルディスクリプタ
+\fIfd\fP を用いて指定する点である。 ファイルディスクリプタ \fIfd\fP は、読み込み専用でオープンされていなければならず、
\91¼ã\81³å\87ºã\81\97å\85\83ã\81¯ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81\8cå\8f\82ç\85§ã\81\99ã\82\8bã\83\95ã\82¡ã\82¤ã\83«ã\81«å¯¾ã\81\99ã\82\8b å®\9fè¡\8c許å\8f¯ã\82\92æ\8c\81ã\81£ã\81¦ã\81\84ã\81ªã\81\91ã\82\8cã\81°ã\81ªã\82\89ã\81ªã\81\84ã\80\82
 .SH 返り値
 \fBfexecve\fP()  は呼び出しに成功した場合、戻ることはない。 エラーの場合、返り値 \-1 で関数が返り、 \fIerrno\fP
 が適切に設定される。
@@ -72,7 +72,7 @@ _GNU_SOURCE
 エラーは \fBexecve\fP(2)  と同じだが、以下のエラーが追加になっている:
 .TP 
 \fBEINVAL\fP
-\fIfd\fP が有効なファイルディスクリプタでない。または \fIargv\fP が NULL である。または \fIenvp\fP が NULL である。
+\fIfd\fP ã\81\8cæ\9c\89å\8a¹ã\81ªã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81§ã\81ªã\81\84ã\80\82ã\81¾ã\81\9fã\81¯ \fIargv\fP ã\81\8c NULL ã\81§ã\81\82ã\82\8bã\80\82ã\81¾ã\81\9fã\81¯ \fIenvp\fP ã\81\8c NULL ã\81§ã\81\82ã\82\8bã\80\82
 .TP 
 \fBENOSYS\fP
 \fI/proc\fP ファイルシステムにアクセスできなかった。
@@ -82,23 +82,34 @@ _GNU_SOURCE
 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 がマウントされて利用可能となっている必要がある。
 
-If \fIfd\fP is a file descriptor that refers to an interpreter script and has
-been marked as close\-on\-exec (see the discussion of the \fBFD_CLOEXEC\fP in
-\fBfcntl\fP(2)), \fBfexecve\fP()  will fail to execute the script, since, by the
-time the script interpreter tries to access the script file, \fIfd\fP has
-already been closed.
-
 \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)
+\fBexecve\fP(2), \fBexecveat\fP(2)
 .SH この文書について
-この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.65 の一部
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.79 の一部
 である。プロジェクトの説明とバグ報告に関する情報は
 http://www.kernel.org/doc/man\-pages/ に書かれている。