.\" Updated 2013-03-22, Akihiro MOTOKI, LDP v3.50
.\" Updated 2013-07-22, Akihiro MOTOKI, LDP v3.52
.\"
-.TH EXECVE 2 2014\-05\-10 Linux "Linux Programmer's Manual"
+.TH EXECVE 2 2015\-01\-22 Linux "Linux Programmer's Manual"
.SH 名前
execve \- プログラムを実行する
.SH 書式
.fi
.in
-å¾\8cè\80\85ã\81®è©³ç´°ã\81¯ã\80\81å¾\8cã\82\8dã\81®ã\80\8cã\82¤ã\83³ã\82¿ã\83\97ã\83ªã\82¿ã\83»スクリプト」の節を参照のこと。
+å¾\8cè\80\85ã\81®è©³ç´°ã\81¯ã\80\81å¾\8cã\82\8dã\81®ã\80\8cã\82¤ã\83³ã\82¿ã\83¼ã\83\97ã\83ªã\82¿ã\83¼スクリプト」の節を参照のこと。
\fIargv\fP は新しいプログラムに渡される引き数文字列の配列である。
慣例では、引き数文字列の最初の要素には実行されたファイルに関連付けられた
ファイル名を含めることになっている。
\fIenvp\fP は文字列の配列であり、伝統的に \fBkey=value\fP の形式をしており、
新しいプログラムの環境変数として渡される。
-\fIargv\fP と \fIenvp\fP はいずれものヌルポインタで終わっている必要がある。
+\fIargv\fP ã\81¨ \fIenvp\fP ã\81¯ã\81\84ã\81\9aã\82\8cã\82\82ã\81®ã\83\8cã\83«ã\83\9dã\82¤ã\83³ã\82¿ã\83¼ã\81§çµ\82ã\82\8fã\81£ã\81¦ã\81\84ã\82\8bå¿\85è¦\81ã\81\8cã\81\82ã\82\8bã\80\82
引き数配列と環境変数は、呼び出されたプログラムの main 関数を
以下のように定義することによってアクセス可能になる。
\fIfilename\fP で指定されたプログラムファイルに set\-user\-ID ビットが設定されており、 ファイルが存在するファイルシステムが
\fInosuid\fP (\fBmount\fP(2) の \fBMS_NOSUID\fP フラグ) でマウントされておらず、 呼び出したプロセスが ptrace
-されていない場合、 呼び出したプロセスの実効 (effective) ユーザ ID は プログラムファイルの所有者 (owner) に変更される。
+されていない場合、 呼び出したプロセスの実効 (effective) ユーザー ID は プログラムファイルの所有者 (owner) に変更される。
同様に、プログラムファイルに set\-group\-ID ビットが設定されていた場合、 呼び出したプロセスの有効グループ ID は
プログラムファイルのグループに変更される。
-プロセスの実効ユーザ ID は保存 (saved) set\-user\-ID にコピーされる。 同様に、実効グループ ID は保存
+プロセスの実効ユーザー ID は保存 (saved) set\-user\-ID にコピーされる。 同様に、実効グループ ID は保存
set\-group\-ID にコピーされる。 このコピーは、set\-user\-ID / set\-group\-ID 許可ビットにより発生する 実効 ID
の変更後に行われる。
-実行ファイルが動的リンクされた a.out 実行形式で、共有ライブラリの スタブを含むものだった場合、実行の開始時に Linux の ダイナミックリンカ
-\fBld.so\fP(8) が呼び出され、必要な共有ライブラリをメモリに読み込んでリンクを行う。
+実行ファイルが動的リンクされた a.out 実行形式で、共有ライブラリの スタブを含むものだった場合、実行の開始時に Linux の
+ダイナミックリンカー \fBld.so\fP(8) が呼び出され、必要な共有ライブラリをメモリーに読み込んでリンクを行う。
実行ファイルがダイナミックリンクされた ELF 実行形式だった場合、
-PT_INTERP ã\82»ã\82°ã\83¡ã\83³ã\83\88ã\81«æ\8c\87å®\9aã\81\95ã\82\8cã\81\9fã\82¤ã\83³ã\82¿ã\83\97ã\83ªã\82¿が必要な 共有ライブラリ
+PT_INTERP ã\82»ã\82°ã\83¡ã\83³ã\83\88ã\81«æ\8c\87å®\9aã\81\95ã\82\8cã\81\9fã\82¤ã\83³ã\82¿ã\83¼ã\83\97ã\83ªã\82¿ã\83¼が必要な 共有ライブラリ
(shared library) を読み込むのに使用される。
-通常、インタプリタは glibc 2 をリンクしたバイナリでは
-\fI/lib/ld\-linux.so.2\fP である (古い Linux libc5 をリンクした
-バイナリでは、通常のインタプリタは \fI/lib/ld\-linux.so.1\fP であった)。
+通常、インタープリターは glibc をリンクしたバイナリでは
+\fI/lib/ld\-linux.so.2\fP である。
以下に示す以外のすべてのプロセス属性は \fBexecve\fP() の前後で保持される。
.IP * 3
.IP *
代替シグナルスタックはどれも保持されない (\fBsigaltstack\fP(2))。
.IP *
-メモリマッピングは保持されない (\fBmmap\fP(2))。
+ã\83¡ã\83¢ã\83ªã\83¼ã\83\9eã\83\83ã\83\94ã\83³ã\82°ã\81¯ä¿\9dæ\8c\81ã\81\95ã\82\8cã\81ªã\81\84 (\fBmmap\fP(2))ã\80\82
.IP *
-付加された (attached) System\ V 共有メモリセグメントは分離される (\fBshmat\fP(2))。
+ä»\98å\8a ã\81\95ã\82\8cã\81\9f (attached) System\ V å\85±æ\9c\89ã\83¡ã\83¢ã\83ªã\83¼ã\82»ã\82°ã\83¡ã\83³ã\83\88ã\81¯å\88\86é\9b¢ã\81\95ã\82\8cã\82\8b (\fBshmat\fP(2))ã\80\82
.IP *
-POSIX 共有メモリ領域はマッピングを解除される (\fBshm_open\fP(3))。
+POSIX 共有メモリー領域はマッピングを解除される (\fBshm_open\fP(3))。
.IP *
-オープンされた POSIX メッセージキューディスクリプタはクローズされる (\fBmq_overview\fP(7))。
+ã\82ªã\83¼ã\83\97ã\83³ã\81\95ã\82\8cã\81\9f POSIX ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\82ã\83¥ã\83¼ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81¯ã\82¯ã\83ã\83¼ã\82ºã\81\95ã\82\8cã\82\8b (\fBmq_overview\fP(7))ã\80\82
.IP *
オープンされた POSIX 名前付きセマフォはいずれもクローズされる (\fBsem_overview\fP(7))。
.IP *
-POSIX タイマは保持されない (\fBtimer_create\fP(2))。
+POSIX ã\82¿ã\82¤ã\83\9eã\83¼ã\81¯ä¿\9dæ\8c\81ã\81\95ã\82\8cã\81ªã\81\84 (\fBtimer_create\fP(2))ã\80\82
.IP *
オープンされたディレクトリストリームはいずれもクローズされる (\fBopendir\fP(3))。
.IP *
-メモリロックは保持されない (\fBmlock\fP(2), \fBmlockall\fP(2))。
+ã\83¡ã\83¢ã\83ªã\83¼ã\83ã\83\83ã\82¯ã\81¯ä¿\9dæ\8c\81ã\81\95ã\82\8cã\81ªã\81\84 (\fBmlock\fP(2), \fBmlockall\fP(2))ã\80\82
.IP *
-終了 (exit) ハンドラは保持されない (\fBatexit\fP(3), \fBon_exit\fP(3))。
+çµ\82äº\86 (exit) ã\83\8fã\83³ã\83\89ã\83©ã\83¼ã\81¯ä¿\9dæ\8c\81ã\81\95ã\82\8cã\81ªã\81\84 (\fBatexit\fP(3), \fBon_exit\fP(3))ã\80\82
.IP *
浮動小数点関連の環境はデフォルトにリセットされる (\fBfenv\fP(3) 参照)。
.PP
.\" On Linux it appears that these file descriptors are
.\" always open after an execve(), and it looks like
.\" Solaris 8 and FreeBSD 6.1 are the same. -- mtk, 30 Apr 2007
-デフォルトでは、ファイルディスクリプタは \fBexecve\fP() を行った後でもオープンされたままである。 close\-on\-exec
-の印が付いているファイルディスクリプタはクローズされる。 \fBfcntl\fP(2) の \fBFD_CLOEXEC\fP の説明を参照。
-(ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\81\8cã\82¯ã\83ã\83¼ã\82ºã\81\95ã\82\8cã\82\8bã\81¨ã\80\81ã\81\93ã\81®ã\83\97ã\83ã\82»ã\82¹ã\81\8c ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿に対応するファイルに対して獲得していた
-レコードのロックが全て解放されることになる。) POSIX.1\-2001 では、 ファイルディスクリプタ 0, 1, 2 が \fBexecve\fP()
+ã\83\87ã\83\95ã\82©ã\83«ã\83\88ã\81§ã\81¯ã\80\81ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81¯ \fBexecve\fP() ã\82\92è¡\8cã\81£ã\81\9få¾\8cã\81§ã\82\82ã\82ªã\83¼ã\83\97ã\83³ã\81\95ã\82\8cã\81\9fã\81¾ã\81¾ã\81§ã\81\82ã\82\8bã\80\82 close\-on\-exec
+ã\81®å\8d°ã\81\8cä»\98ã\81\84ã\81¦ã\81\84ã\82\8bã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81¯ã\82¯ã\83ã\83¼ã\82ºã\81\95ã\82\8cã\82\8bã\80\82 \fBfcntl\fP(2) ã\81® \fBFD_CLOEXEC\fP ã\81®èª¬æ\98\8eã\82\92å\8f\82ç\85§ã\80\82
+(ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81\8cã\82¯ã\83ã\83¼ã\82ºã\81\95ã\82\8cã\82\8bã\81¨ã\80\81ã\81\93ã\81®ã\83\97ã\83ã\82»ã\82¹ã\81\8c ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼に対応するファイルに対して獲得していた
+レコードのロックが全て解放されることになる。) POSIX.1\-2001 では、 ファイルディスクリプター 0, 1, 2 が \fBexecve\fP()
成功後にどこかでクローズされ、かつ 実行されるファイルに set\-user_ID か set\-group_ID の許可ビットが
-セットされていてプロセスが特権を獲得した場合、 システムは何らかのファイルをオープンする際に これらの番号のディスクリプタのどれかを使うことがある、
+ã\82»ã\83\83ã\83\88ã\81\95ã\82\8cã\81¦ã\81\84ã\81¦ã\83\97ã\83ã\82»ã\82¹ã\81\8cç\89¹æ¨©ã\82\92ç\8d²å¾\97ã\81\97ã\81\9få ´å\90\88ã\80\81 ã\82·ã\82¹ã\83\86ã\83 ã\81¯ä½\95ã\82\89ã\81\8bã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\82\92ã\82ªã\83¼ã\83\97ã\83³ã\81\99ã\82\8bé\9a\9bã\81« ã\81\93ã\82\8cã\82\89ã\81®ç\95ªå\8f·ã\81®ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81®ã\81©ã\82\8cã\81\8bã\82\92使ã\81\86ã\81\93ã\81¨ã\81\8cã\81\82ã\82\8bã\80\81
とされている。 原則として、移植性が必要なプログラムでは、 特権の有無に関わらず、 \fBexecve\fP() の前後でこれら
-3つのファイルディスクリプタがクローズされたままで あることを前提にすることはできない。
-.SS ã\82¤ã\83³ã\82¿ã\83\97ã\83ªã\82¿ã\83»スクリプト
-ã\82¤ã\83³ã\82¿ã\83\97ã\83ªã\82¿ã\83»スクリプトとは、実行許可が有効になっていて、 最初の行が以下の形になっているテキストファイルのことである。
+3ã\81¤ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81\8cã\82¯ã\83ã\83¼ã\82ºã\81\95ã\82\8cã\81\9fã\81¾ã\81¾ã\81§ ã\81\82ã\82\8bã\81\93ã\81¨ã\82\92å\89\8dæ\8f\90ã\81«ã\81\99ã\82\8bã\81\93ã\81¨ã\81¯ã\81§ã\81\8dã\81ªã\81\84ã\80\82
+.SS ã\82¤ã\83³ã\82¿ã\83¼ã\83\97ã\83ªã\82¿ã\83¼スクリプト
+ã\82¤ã\83³ã\82¿ã\83¼ã\83\97ã\83ªã\82¿ã\83¼スクリプトとは、実行許可が有効になっていて、 最初の行が以下の形になっているテキストファイルのことである。
.in +4n
.nf
.in
\fIinterpreter\fP は有効な実行ファイルのパス名でなければならず、 それ自身がスクリプトであってはならない。 \fBexecve\fP() の
-\fIfilename\fP å¼\95ã\81\8dæ\95°ã\81\8cã\82¤ã\83³ã\82¿ã\83\97ã\83ªã\82¿スクリプトを指定している場合、 \fIinterpreter\fP は以下の引き数で起動される。
+\fIfilename\fP å¼\95ã\81\8dæ\95°ã\81\8cã\82¤ã\83³ã\82¿ã\83¼ã\83\97ã\83ªã\82¿ã\83¼スクリプトを指定している場合、 \fIinterpreter\fP は以下の引き数で起動される。
.in +4n
.nf
(\fBARG_MAX\fP は \fI<limits.h>\fP で定義されるか、実行時に \fIsysconf(_SC_ARG_MAX)\fP
の呼び出しで入手できるかのいずれかである)。
-カーネル 2.6.23 より前の Linux では、環境変数と引き数の文字列群を 格納するのに使用されるメモリは 32 ページに制限されていた (32
-ページというのはカーネル定数 \fBMAX_ARG_PAGES\fP で定義される)。したがって、 ページサイズが 4 kB のアーキテクチャでは、
+ã\82«ã\83¼ã\83\8dã\83« 2.6.23 ã\82\88ã\82\8aå\89\8dã\81® Linux ã\81§ã\81¯ã\80\81ç\92°å¢\83å¤\89æ\95°ã\81¨å¼\95ã\81\8dæ\95°ã\81®æ\96\87å\97å\88\97群ã\82\92 æ ¼ç´\8dã\81\99ã\82\8bã\81®ã\81«ä½¿ç\94¨ã\81\95ã\82\8cã\82\8bã\83¡ã\83¢ã\83ªã\83¼ã\81¯ 32 ã\83\9aã\83¼ã\82¸ã\81«å\88¶é\99\90ã\81\95ã\82\8cã\81¦ã\81\84ã\81\9f (32
+ã\83\9aã\83¼ã\82¸ã\81¨ã\81\84ã\81\86ã\81®ã\81¯ã\82«ã\83¼ã\83\8dã\83«å®\9aæ\95° \fBMAX_ARG_PAGES\fP ã\81§å®\9a義ã\81\95ã\82\8cã\82\8b)ã\80\82ã\81\97ã\81\9fã\81\8cã\81£ã\81¦ã\80\81 ã\83\9aã\83¼ã\82¸ã\82µã\82¤ã\82ºã\81\8c 4 kB ã\81®ã\82¢ã\83¼ã\82ã\83\86ã\82¯ã\83\81ã\83£ã\83¼ã\81§ã\81¯ã\80\81
最大サイズは 128 kB ということになる。
.\" For some background on the changes to ARG_MAX in kernels 2.6.23 and
.\" checked into 2.6.25 as commit a64e715fc74b1a7dcc5944f848acc38b2c4d4ee2.
.\" Ollie: That doesn't include the lists of pointers, though,
.\" so the actual usage is a bit higher (1 pointer per argument).
-カーネル 2.6.23 以降では、ほとんどのアーキテクチャにおいて、 \fBexecve\fP() が呼び出された時点で適用されているリソースのソフト上限
-\fBRLIMIT_STACK\fP に基づいたサイズ上限が使われる (メモリ管理ユニット (MMU) を持たないアーキテクチャは上記の変更の
-例外であり、これらのアーキテクチャではカーネル 2.6.23 より前と 同じ上限がそのまま使用される)。
-これらのアーキテクチャでは、合計サイズは許可されたスタックサイズの 1/4 に制限されている (1/4
+ã\82«ã\83¼ã\83\8dã\83« 2.6.23 以é\99\8dã\81§ã\81¯ã\80\81ã\81»ã\81¨ã\82\93ã\81©ã\81®ã\82¢ã\83¼ã\82ã\83\86ã\82¯ã\83\81ã\83£ã\83¼ã\81«ã\81\8aã\81\84ã\81¦ã\80\81 \fBexecve\fP() ã\81\8cå\91¼ã\81³å\87ºã\81\95ã\82\8cã\81\9fæ\99\82ç\82¹ã\81§é\81©ç\94¨ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\83ªã\82½ã\83¼ã\82¹ã\81®ã\82½ã\83\95ã\83\88ä¸\8aé\99\90
+\fBRLIMIT_STACK\fP に基づいたサイズ上限が使われる (メモリー管理ユニット (MMU) を持たないアーキテクチャーは上記の変更の
+ä¾\8bå¤\96ã\81§ã\81\82ã\82\8aã\80\81ã\81\93ã\82\8cã\82\89ã\81®ã\82¢ã\83¼ã\82ã\83\86ã\82¯ã\83\81ã\83£ã\83¼ã\81§ã\81¯ã\82«ã\83¼ã\83\8dã\83« 2.6.23 ã\82\88ã\82\8aå\89\8dã\81¨ å\90\8cã\81\98ä¸\8aé\99\90ã\81\8cã\81\9dã\81®ã\81¾ã\81¾ä½¿ç\94¨ã\81\95ã\82\8cã\82\8b)ã\80\82
+ã\81\93ã\82\8cã\82\89ã\81®ã\82¢ã\83¼ã\82ã\83\86ã\82¯ã\83\81ã\83£ã\83¼ã\81§ã\81¯ã\80\81å\90\88è¨\88ã\82µã\82¤ã\82ºã\81¯è¨±å\8f¯ã\81\95ã\82\8cã\81\9fã\82¹ã\82¿ã\83\83ã\82¯ã\82µã\82¤ã\82ºã\81® 1/4 ã\81«å\88¶é\99\90ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8b (1/4
の上限を設けているのは、新しいプログラムが必ずある程度の スタック空間を持てることを保証するためである)。 Linux 2.6.25
以降では、カーネルはこのサイズ上限に 32 ページの下限を 設けている。これにより、 \fBRLIMIT_STACK\fP
が非常に小さく設定された場合でも、アプリケーションが少なくとも Linux 2.6.23 以前で提供されていたのと同じ大きさの引き数と環境変数の空間
環境変数 (\fIenvp\fP) と引き数リスト (\fIargv\fP) の合計バイト数が大き過ぎる。
.TP
\fBEACCES\fP
-\fIfilename\fP ã\82\84ã\82¹ã\82¯ã\83ªã\83\97ã\83\88ã\82¤ã\83³ã\82¿ã\83\97ã\83ªã\82¿名の構成要素に検索許可 (search permission) が与えられていない
+\fIfilename\fP ã\82\84ã\82¹ã\82¯ã\83ªã\83\97ã\83\88ã\82¤ã\83³ã\82¿ã\83¼ã\83\97ã\83ªã\82¿ã\83¼名の構成要素に検索許可 (search permission) が与えられていない
(\fBpath_resolution\fP(7) も参照すること)。
.TP
\fBEACCES\fP
-ã\83\95ã\82¡ã\82¤ã\83«ã\82\82ã\81\97ã\81\8fã\81¯ã\82¹ã\82¯ã\83ªã\83\97ã\83\88ã\81®ã\82¤ã\83³ã\82¿ã\83\97ã\83ªã\82¿が通常ファイル (regular file) でない。
+ã\83\95ã\82¡ã\82¤ã\83«ã\82\82ã\81\97ã\81\8fã\81¯ã\82¹ã\82¯ã\83ªã\83\97ã\83\88ã\81®ã\82¤ã\83³ã\82¿ã\83¼ã\83\97ã\83ªã\82¿ã\83¼が通常ファイル (regular file) でない。
.TP
\fBEACCES\fP
-ã\83\95ã\82¡ã\82¤ã\83«ã\82\84ã\82¹ã\82¯ã\83ªã\83\97ã\83\88ã\82\84 ELF ã\82¤ã\83³ã\82¿ã\83\97ã\83ªã\82¿に 実行許可 (execute permission) が与えられていない。
+ã\83\95ã\82¡ã\82¤ã\83«ã\82\84ã\82¹ã\82¯ã\83ªã\83\97ã\83\88ã\82\84 ELF ã\82¤ã\83³ã\82¿ã\83¼ã\83\97ã\83ªã\82¿ã\83¼に 実行許可 (execute permission) が与えられていない。
.TP
\fBEACCES\fP
ファイルシステムが \fInoexec\fP でマウントされている。
.TP
+\fBEAGAIN\fP (Linux 3.1 以降)
+.\" commit 72fa59970f8698023045ab0713d66f3f4f96945c
+\fBset*uid\fP() のいずれかの呼び出しでプロセスの実 UID が変更されたとすると、呼び出し元の \fBRLIMIT_NPROC\fP リソース上限
+(\fBsetrlimit\fP(2) 参照) を超えてしまう、 現在もまだ超えている。 このエラーの詳細な説明については「注意」の節を参照。
+.TP
\fBEFAULT\fP
-\fIfilename\fP または配列 \fIargv\fP か \fIenvp\fP のポインタの一つがアクセス可能なアドレス空間の外を指している。
+\fIfilename\fP ã\81¾ã\81\9fã\81¯é\85\8då\88\97 \fIargv\fP ã\81\8b \fIenvp\fP ã\81®ã\83\9dã\82¤ã\83³ã\82¿ã\83¼ã\81®ä¸\80ã\81¤ã\81\8cã\82¢ã\82¯ã\82»ã\82¹å\8f¯è\83½ã\81ªã\82¢ã\83\89ã\83¬ã\82¹ç©ºé\96\93ã\81®å¤\96ã\82\92æ\8c\87ã\81\97ã\81¦ã\81\84ã\82\8bã\80\82
.TP
\fBEINVAL\fP
-ELF å®\9fè¡\8cå½¢å¼\8fã\81§è¤\87æ\95°ã\81® PT_INTERP ã\82»ã\82°ã\83¡ã\83³ã\83\88ã\81\8cå\98å\9c¨ã\81\99ã\82\8bã\80\82 (ã\81\99ã\81ªã\82\8fã\81¡è¤\87æ\95°ã\81®ã\82¤ã\83³ã\82¿ã\83\97ã\83ªã\82¿を指定した。)
+ELF å®\9fè¡\8cå½¢å¼\8fã\81§è¤\87æ\95°ã\81® PT_INTERP ã\82»ã\82°ã\83¡ã\83³ã\83\88ã\81\8cå\98å\9c¨ã\81\99ã\82\8bã\80\82 (ã\81\99ã\81ªã\82\8fã\81¡è¤\87æ\95°ã\81®ã\82¤ã\83³ã\82¿ã\83¼ã\83\97ã\83ªã\82¿ã\83¼を指定した。)
.TP
\fBEIO\fP
I/O エラーが発生した。
.TP
\fBEISDIR\fP
-ELF ã\82¤ã\83³ã\82¿ã\83\97ã\83ªã\82¿がディレクトリだった。
+ELF ã\82¤ã\83³ã\82¿ã\83¼ã\83\97ã\83ªã\82¿ã\83¼がディレクトリだった。
.TP
\fBELIBBAD\fP
-ELF ã\82¤ã\83³ã\82¿ã\83\97ã\83ªã\82¿が理解できるフォーマットでなかった。
+ELF ã\82¤ã\83³ã\82¿ã\83¼ã\83\97ã\83ªã\82¿ã\83¼が理解できるフォーマットでなかった。
.TP
\fBELOOP\fP
-\fIfilename\fP ã\82\84ã\82¹ã\82¯ã\83ªã\83\97ã\83\88ã\82\84 ELF ã\81®ã\82¤ã\83³ã\82¿ã\83\97ã\83ªã\82¿を解決する際に遭遇した シンボリックリンクが多過ぎる。
+\fIfilename\fP ã\82\84ã\82¹ã\82¯ã\83ªã\83\97ã\83\88ã\82\84 ELF ã\81®ã\82¤ã\83³ã\82¿ã\83¼ã\83\97ã\83ªã\82¿ã\83¼を解決する際に遭遇した シンボリックリンクが多過ぎる。
.TP
\fBEMFILE\fP
そのプロセスがオープンできるファイル数の上限まで既にオープンしている。
オープンされたファイルの総数がシステム全体の上限に達していた。
.TP
\fBENOENT\fP
-ã\83\95ã\82¡ã\82¤ã\83« \fIfilename\fP ã\81\8bã\82¹ã\82¯ã\83ªã\83\97ã\83\88ã\82\84 ELF ã\81®ã\82¤ã\83³ã\82¿ã\83\97ã\83ªã\82¿が存在しない。
+ã\83\95ã\82¡ã\82¤ã\83« \fIfilename\fP ã\81\8bã\82¹ã\82¯ã\83ªã\83\97ã\83\88ã\82\84 ELF ã\81®ã\82¤ã\83³ã\82¿ã\83¼ã\83\97ã\83ªã\82¿ã\83¼が存在しない。
.TP
\fBENOEXEC\fP
-実行ファイルが理解できない形式であるか、違うアーキテクチャのものか、 その他のフォーマットエラーにより実行ができなかった。
+å®\9fè¡\8cã\83\95ã\82¡ã\82¤ã\83«ã\81\8cç\90\86解ã\81§ã\81\8dã\81ªã\81\84å½¢å¼\8fã\81§ã\81\82ã\82\8bã\81\8bã\80\81é\81\95ã\81\86ã\82¢ã\83¼ã\82ã\83\86ã\82¯ã\83\81ã\83£ã\83¼ã\81®ã\82\82ã\81®ã\81\8bã\80\81 ã\81\9dã\81®ä»\96ã\81®ã\83\95ã\82©ã\83¼ã\83\9eã\83\83ã\83\88ã\82¨ã\83©ã\83¼ã\81«ã\82\88ã\82\8aå®\9fè¡\8cã\81\8cã\81§ã\81\8dã\81ªã\81\8bã\81£ã\81\9fã\80\82
.TP
\fBENOMEM\fP
-カーネルに十分なメモリがない。
+ã\82«ã\83¼ã\83\8dã\83«ã\81«å\8d\81å\88\86ã\81ªã\83¡ã\83¢ã\83ªã\83¼ã\81\8cã\81ªã\81\84ã\80\82
.TP
\fBENOTDIR\fP
-\fIfilename\fP ã\82\84ã\82¹ã\82¯ã\83ªã\83\97ã\83\88ã\82\84 ELF ã\81®ã\82¤ã\83³ã\82¿ã\83\97ã\83ªã\82¿の構成要素がディレクトリでない。
+\fIfilename\fP ã\82\84ã\82¹ã\82¯ã\83ªã\83\97ã\83\88ã\82\84 ELF ã\81®ã\82¤ã\83³ã\82¿ã\83¼ã\83\97ã\83ªã\82¿ã\83¼の構成要素がディレクトリでない。
.TP
\fBEPERM\fP
-ã\83\95ã\82¡ã\82¤ã\83«ã\82·ã\82¹ã\83\86ã\83 ã\81\8c \fInosuid\fP ã\81§ã\83\9eã\82¦ã\83³ã\83\88ã\81\95ã\82\8cã\80\81ã\83¦ã\83¼ã\82¶ã\81\8cã\82¹ã\83¼ã\83\91ã\83¼ã\83¦ã\83¼ã\82¶でなく、 ファイルに set\-user\-ID あるいは
+ã\83\95ã\82¡ã\82¤ã\83«ã\82·ã\82¹ã\83\86ã\83 ã\81\8c \fInosuid\fP ã\81§ã\83\9eã\82¦ã\83³ã\83\88ã\81\95ã\82\8cã\80\81ã\83¦ã\83¼ã\82¶ã\83¼ã\81\8cã\82¹ã\83¼ã\83\91ã\83¼ã\83¦ã\83¼ã\82¶ã\83¼でなく、 ファイルに set\-user\-ID あるいは
set\-group\-ID ビットが設定されている。
.TP
\fBEPERM\fP
-プロセスがトレースされ、ユーザがスーパーユーザでなく、 ファイルに set\-user\-ID あるいは set\-group\-ID ビットが設定されている。
+プロセスがトレースされ、ユーザーがスーパーユーザーでなく、 ファイルに set\-user\-ID あるいは set\-group\-ID
+ビットが設定されている。
.TP
\fBETXTBSY\fP
実行ファイルを書き込み用にオープンしているプロセスがある。
どの様に扱うかは、Linux カーネルのバージョンによって異なる: あるバージョンでは、すでに必要な権限を持っている場合を除いて、 その実行を拒否する
(そして \fBEPERM\fP を返す)。別のあるバージョンでは set\-user\-ID/set\-group\-ID ビットのみを無視し \fBexec\fP()
は成功する。 Linux では、 \fIargv\fP と \fIenvp\fP に NULL を指定することができる。 どちらに NULL を指定した場合も、
-これらの引き数にヌルポインタ 1 個だけを含むリストへのポインタを指定したのと同じ効果を持つ。 \fB「この間違った機能を利用しないこと」\fP。
+これらの引き数にヌルポインター 1 個だけを含むリストへのポインターを指定したのと同じ効果を持つ。 \fB「この間違った機能を利用しないこと」\fP。
これは非標準で、移植性もない。 他のほとんどの UNIX システムでは、これを行うとエラー (\fBEFAULT\fP) になる。
POSIX.1\-2001 は、 \fBsysconf\fP(3) が返す値はプロセスの生存中は変化しないべきだとしている。 しかしながら、Linux
呼び出し元に制御が戻る時点を過ぎてからエラーが発生する場合がある。 元の実行可能イメージはすでに破棄されているが、
新しいイメージが完全には構築されていないという状況である。 このような場合、カーネルはそのプロセスをシグナル \fBSIGKILL\fP で停止 (kill)
する。
-.SS ã\82¤ã\83³ã\82¿ã\83\97ã\83ªã\82¿ã\83»スクリプト
-ã\82¤ã\83³ã\82¿ã\83\97ã\83ªã\82¿スクリプトの 1行目に許されている文字数は、 最大 127 文字である。
+.SS ã\82¤ã\83³ã\82¿ã\83¼ã\83\97ã\83ªã\82¿ã\83¼スクリプト
+ã\82¤ã\83³ã\82¿ã\83¼ã\83\97ã\83ªã\82¿ã\83¼スクリプトの 1行目に許されている文字数は、 最大 127 文字である。
.\" e.g., Solaris 8
.\" e.g., FreeBSD before 6.0, but not FreeBSD 6.0 onward
-ã\82¤ã\83³ã\82¿ã\83\97ã\83ªã\82¿ã\83»ã\82¹ã\82¯ã\83ªã\83\97ã\83\88ã\81® \fIoptional\-arg\fP å¼\95ã\81\8dæ\95°ã\81®è§£é\87\88æ\96¹æ³\95ã\81¯å®\9fè£\85ã\81«ã\82\88ã\82\8aç\95°ã\81ªã\82\8bã\80\82 Linux ã\81§ã\81¯ã\80\81ã\82¤ã\83³ã\82¿ã\83\97ã\83ªã\82¿名
-\fIinterpreter\fP ã\81«ç¶\9aã\81\8fæ\96\87å\97å\88\97å\85¨ä½\93ã\81\8cã\82¤ã\83³ã\82¿ã\83\97ã\83ªã\82¿ã\81« 1å\80\8bã\81®å¼\95ã\81\8dæ\95°ã\81¨ã\81\97ã\81¦æ¸¡ã\81\95ã\82\8cã\82\8bã\80\82 ã\81\97ã\81\8bã\81\97ã\80\81å\8b\95ä½\9cã\81\8cç\95°ã\81ªã\82\8bã\82·ã\82¹ã\83\86ã\83 ã\82\82ã\81\82ã\82\8bã\80\82 ã\81\82ã\82\8bã\82·ã\82¹ã\83\86ã\83 ã\81§ã\81¯ã\80\81
-\fIoptional\-arg\fP のうち最初のホワイトスペースまでが 引き数として渡される。 また、別のシステムでは
-ã\82¤ã\83³ã\82¿ã\83\97ã\83ªã\82¿ã\83»スクリプトは複数の引き数を持つことができ、 \fIoptional\-arg\fP 内のホワイトスペースが引き数の区切りとなる。
+ã\82¤ã\83³ã\82¿ã\83¼ã\83\97ã\83ªã\82¿ã\83¼ã\82¹ã\82¯ã\83ªã\83\97ã\83\88ã\81® \fIoptional\-arg\fP å¼\95ã\81\8dæ\95°ã\81®è§£é\87\88æ\96¹æ³\95ã\81¯å®\9fè£\85ã\81«ã\82\88ã\82\8aç\95°ã\81ªã\82\8bã\80\82 Linux ã\81§ã\81¯ã\80\81ã\82¤ã\83³ã\82¿ã\83¼ã\83\97ã\83ªã\82¿ã\83¼名
+\fIinterpreter\fP ã\81«ç¶\9aã\81\8fæ\96\87å\97å\88\97å\85¨ä½\93ã\81\8cã\82¤ã\83³ã\82¿ã\83¼ã\83\97ã\83ªã\82¿ã\83¼ã\81« 1å\80\8bã\81®å¼\95ã\81\8dæ\95°ã\81¨ã\81\97ã\81¦æ¸¡ã\81\95ã\82\8cã\82\8bã\80\82 ã\81\97ã\81\8bã\81\97ã\80\81å\8b\95ä½\9cã\81\8cç\95°ã\81ªã\82\8bã\82·ã\82¹ã\83\86ã\83 ã\82\82ã\81\82ã\82\8bã\80\82
+あるシステムでは、 \fIoptional\-arg\fP のうち最初のホワイトスペースまでが 引き数として渡される。 また、別のシステムでは
+ã\82¤ã\83³ã\82¿ã\83¼ã\83\97ã\83ªã\82¿ã\83¼スクリプトは複数の引き数を持つことができ、 \fIoptional\-arg\fP 内のホワイトスペースが引き数の区切りとなる。
.\"
+.\" .SH BUGS
+.\" Some Linux versions have failed to check permissions on ELF
+.\" interpreters. This is a security hole, because it allows users to
+.\" open any file, such as a rewinding tape device, for reading. Some
+.\" Linux versions have also had other security holes in
+.\" .BR execve ()
+.\" that could be exploited for denial of service by a suitably crafted
+.\" ELF binary. There are no known problems with 2.0.34 or 2.2.15.
Linux はスクリプトの set\-user\-ID と set\-group\-ID ビットを無視する。
+.SS "execve() と EAGAIN"
+\fBexecve\fP() を呼び出した際に (Linux 3.1 以降で) 起こり得る \fBEAGAIN\fP エラーの詳細な説明を以下で行う。
+
+.\" commit 909cc4ae86f3380152a18e2a3c44523893ee11c4
+\fI直前の\fP \fBsetuid\fP(2), \fBsetreuid\fP(2), \fBsetresuid\fP(2) の呼び出しで、 そのプロセスの実ユーザー ID
+が変更され、 その変更によりそのプロセスが \fBRLIMIT_NPROC\fP リソース上限を超過してしまった場合 (すなわち、新しい実ユーザー ID
+に属するプロセス数が \fBRLIMIT_NPROC\fP リソース上限を超過した場合) に、 \fBEAGAIN\fP エラーが発生する。 Linux 2.6.0
+以上 3.0 以下では、これにより \fBset*uid\fP() の呼び出しが失敗していた。 (Linux 2.6 より前では、このリソース上限はユーザー
+ID を変更したプロセスには適用されていなかった。)
+
+Linux 3.1 以降では、上で説明したシナリオでは \fBset*uid\fP() の呼び出しは失敗しない。 なぜなら、
+返されたステータスの確認を行わず「呼び出し元が特権を持っている場合には」呼び出しは必ず成功するとみなしているバグがあるアプリケーションでは、セキュリティホールにつながることが非常によくあるからだ。
+その代わり、 \fBset*uid\fP() の呼び出しによる実 UID の変更は成功するが、 カーネルは \fBPF_NPROC_EXCEEDED\fP
+という名前の内部フラグをセットする。 このフラグは \fBRLIMIT_NPROC\fP リソース上限が超過したことを示す。
+\fBPF_NPROC_EXCEEDED\fP フラグがセットされていて、その後で \fBexecve\fP() が呼ばれた際にリソース上限がまだ超過していれば、
+その \fBexecve\fP() の呼び出しは \fBEAGAIN\fP エラーで失敗する。 このカーネルのロジックにより、
+特権デーモンでよく行われる処理フロー、 すなわち \fBfork\fP(2) + \fBset*uid\fP() + \fBexecve\fP()
+に対して、前と変わらず \fBRLIMIT_NPROC\fP リソース上限を適用できることが保証される。
+
+(\fBset*uid\fP() と \fBexecve\fP() の呼び出しの間に、この実 UID に属する他のプロセスが終了して) 次に \fBexecve\fP()
+が呼び出された際にこのリソース上限が超過してなければ、 \fBexecve\fP() の呼び出しは成功し、カーネルは \fBPF_NPROC_EXCEEDED\fP
+プロセスフラグをクリアする。 同じプロセスによって \fBfork\fP(2) の呼び出しが後で行われた場合にも、このフラグはクリアされる。
.SS 歴史
.\"
.\" .SH BUGS
.fi
.in
-ã\81\95ã\82\89ã\81«ã\80\81ã\81\93ã\82\8cã\82\89ã\81®ã\83\97ã\83ã\82°ã\83©ã\83 ã\82\92使ã\81£ã\81¦ã\80\81ã\82¹ã\82¯ã\83ªã\83\97ã\83\88ã\83»ã\82¤ã\83³ã\82¿ã\83\97ã\83ªã\82¿ã\81®ä¾\8bã\82\92示ã\81\99ã\80\82 ã\81\93ã\81®ã\81\9fã\82\81ã\81«ã\80\81ã\80\8cã\82¤ã\83³ã\82¿ã\83\97ã\83ªã\82¿ã\80\8dã\81¨ã\81\97ã\81¦å\85\88ã\81»ã\81©ä½\9cæ\88\90ã\81\97ã\81\9fã\83\97ã\83ã\82°ã\83©ã\83 \fImyecho\fP
-を使うスクリプトを作成する。
+ã\81\95ã\82\89ã\81«ã\80\81ã\81\93ã\82\8cã\82\89ã\81®ã\83\97ã\83ã\82°ã\83©ã\83 ã\82\92使ã\81£ã\81¦ã\80\81ã\82¹ã\82¯ã\83ªã\83\97ã\83\88ã\82¤ã\83³ã\82¿ã\83¼ã\83\97ã\83ªã\82¿ã\83¼ã\81®ä¾\8bã\82\92示ã\81\99ã\80\82 ã\81\93ã\81®ã\81\9fã\82\81ã\81«ã\80\81ã\80\8cã\82¤ã\83³ã\82¿ã\83¼ã\83\97ã\83ªã\82¿ã\83¼ã\80\8dã\81¨ã\81\97ã\81¦å\85\88ã\81»ã\81©ä½\9cæ\88\90ã\81\97ã\81\9fã\83\97ã\83ã\82°ã\83©ã\83
+\fImyecho\fP を使うスクリプトを作成する。
.in +4n
.nf
-$\fB cat > script.sh\fP
-\fB#! ./myecho script\-arg\fP
+$\fB cat > script\fP
+\fB#!./myecho script\-arg\fP
\fB^D\fP
-$\fB chmod +x script.sh\fP
+$\fB chmod +x script\fP
.fi
.in
.in +4n
.nf
-$\fB ./execve ./script.sh\fP
+$\fB ./execve ./script\fP
argv[0]: ./myecho
argv[1]: script\-arg
-argv[2]: ./script.sh
+argv[2]: ./script
argv[3]: hello
argv[4]: world
.fi
.in
.SH 関連項目
-\fBchmod\fP(2), \fBfork\fP(2), \fBptrace\fP(2), \fBexecl\fP(3), \fBfexecve\fP(3),
-\fBgetopt\fP(3), \fBcredentials\fP(7), \fBenviron\fP(7), \fBpath_resolution\fP(7),
-\fBld.so\fP(8)
+\fBchmod\fP(2), \fBexecveat\fP(2), \fBfork\fP(2), \fBptrace\fP(2), \fBexecl\fP(3),
+\fBfexecve\fP(3), \fBgetopt\fP(3), \fBcredentials\fP(7), \fBenviron\fP(7),
+\fBpath_resolution\fP(7), \fBld.so\fP(8)
.SH この文書について
-この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.68 の一部
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.78 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man\-pages/ に書かれている。