EXECVE

Section: System Calls (2)
索引 jman

BSD mandoc
 

索引

名称

execve - ファイルを実行する  

索引

ライブラリ

Lb libc  

索引

書式

In unistd.h Ft int Fn execve const char *path char *const argv[] char *const envp[]  

索引

解説

Fn execve システムコールは、呼び出しプロセスを新しいプロセスに変換します。 新しいプロセスは new process file と呼ばれる通常のファイルに基づいて構成されます。 このファイルの名前は Fa path によって指定されます。 このファイルは実行可能オブジェクトファイル、またはインタプリタ用の データのファイルです。 実行可能オブジェクトファイルは、識別ヘッダに データのページが続いたもので構成されます。 このデータは、初期プログラム (テキスト) と初期値ありデータのページを表します。 追加のページはヘッダの指定によって 0 データで初期化される場合があります。 elf(5) および a.out5 を参照してください。

インタプリタファイルは次の形式の行で開始します。

#! interpreter Bq Em arg

インタプリタファイルが execve されるとき、システムは実際には指定の interpreterexecve します。 オプションの arg が指定されている場合、それは interpreter の 1番目の引数になり、元々の execve で指定されたファイルの名前は 2 番目の引数になります。 それ以外では execve で指定されたファイルの名前が 1番目の引数になります。 元々の引数はシフトされて後続の引数に なります。 0 番目の引数は指定された interpreter に設定されます。

引数 Fa argv は、ヌル文字で終わる文字ポインタの配列を指すポインタです。 各文字ポインタはヌル文字で終わる文字列を指します。 これらの文字列は、新しいプロセスから参照できる引数リストを構成します。 少なくとも 1 つの引数が配列内に存在している必要があります。 慣習では、最初の要素が実行されたプログラムの名前になるはずです (たとえば、 Fa path の最後の構成要素)。

引数 Fa envp も、ヌル文字で終わる文字ポインタの配列を指すポインタです。 各文字ポインタはヌル文字で終わる文字列を指します。 この配列を指すポインタは、通常、グローバル変数 environ に保存されます。 これらの文字列は、引数としてコマンドへ直接 渡されない情報を新しいプロセスに渡します ( environ(7) を参照)。

呼び出しプロセスイメージ内でオープンされているファイル記述子は、 新しいプロセスイメージの中でもオープンされたままです。 しかし、close-on-exec フラグが設定されているものは例外です。 ( close(2) と fcntl(2) を参照)。 オープンされたままの記述子は Fn execve の影響を受けません。 Fn execve が呼び出された時に標準の記述子 (0, 1 そして / または 2) がクローズされ、 ID 設定の結果、そのプロセスが特権を得た場合には、 それらの記述子は自動的にオープンされます。 特権を持っているかどうかに関わらず、どのプログラムも Fn execve の呼び出しの前後で、これらの記述子が閉じたままとなると 仮定すべきではありません。

呼び出しプロセスで無視するように設定されたシグナルは、 新しいプロセス内でも無視されるように設定されます。 呼び出しプロセスイメージ内で捕捉されるように設定されたシグナルは、 新しいプロセスイメージ内でデフォルトのアクションに 設定されます。 ブロックされたシグナルは、 シグナルアクションの変化とは無関係にブロックされたままになります。 シグナルスタックは未定義にリセットされます (詳細については sigaction(2) を参照してください)。

新しいプロセスイメージファイルにユーザ ID 設定モードビット が設定されている場合 ( chmod(2) を参照)、新しいプロセスイメージの実効ユーザ ID は、 新しいプロセスイメージファイルの所有者 ID に設定されます。 新しいプロセスイメージファイルにグループ ID 設定モードビットが 設定されている場合、新しいプロセスイメージの実効グループ ID は新しい プロセスイメージファイルのグループ ID に設定されます (実効グループ ID はグループリストの最初の要素です)。 新しいプロセスの実ユーザ ID、実グループ ID、およびその他の グループ ID は、呼び出しプロセスイメージと同じになります。 ユーザ ID 設定およびグループ ID 設定処理の後、実効ユーザ ID は 退避ユーザ ID として記録され、実効グループ ID は 退避グループ IDとして記録されます。 これらの値は、後で実効 ID を変更するのに使用できます ( setuid(2) を参照)。

該当するファイルシステムで nosuid オプションが有効な場合、または新しいプロセスファイルがインタプリタ ファイルの場合、ID 設定ビットは意味を持ちません。 実効 ID が変更された場合、システムコールのトレースは 無効になります。

また、新しいプロセスは呼び出しプロセスから次の属性を継承します。

プロセス ID Ta getpid(2)Nsを参照
親プロセス ID Ta getppid(2)Nsを参照
プロセスグループ ID Ta getpgrp(2)Nsを参照
アクセスグループ Ta getgroups(2)Nsを参照
作業ディレクトリ Ta chdir(2)Nsを参照
ルートディレクトリ Ta chroot(2)Nsを参照
制御端末 Ta termios(4)Nsを参照
リソースの使用状況 Ta getrusage(2)Nsを参照
インターバルタイマ Ta getitimer(2)Nsを参照
リソースの使用制限 Ta getrlimit(2)Nsを参照
ファイルモードマスク Ta umask(2)Nsを参照
シグナルマスク Ta sigvec(2)
sigsetmask(2)Nsを参照

Fn execve システムコールの結果として実行されるとき、 プログラムは次のように呼び出されます。

main(argc, argv, envp)
int argc;
char **argv, **envp;

ここで、 Fa argc は Fa argv の要素数 (``arg count'') であり、 Fa argv は、引数自身を指す文字ポインタの配列を指します。  

索引

戻り値

Fn execve システムコールは現在のプロセスイメージを新しいプロセスイメージで 上書きするので、処理が成功した呼び出しには戻るプロセスがありません。 Fn execve が呼び出しプロセスに返ってくる場合は エラーが起きています。 戻り値は -1 で、エラーを示すためにグローバル変数 errno が設定されます  

索引

エラー

次の場合、 Fn execve システムコールは処理に失敗し、呼び出しプロセスに戻ります:

Bq Er ENOTDIR
パスの構成要素中にディレクトリ以外のものが含まれています。
Bq Er ENAMETOOLONG
パス名の構成要素が 255 文字を越えているか、 またはパス名全体が 1023 文字を越えています。
Bq Er ENAMETOOLONG
インタプリトされるスクリプトを起動するときに、 インタプリタの名前が MAXSHELLCMDLEN 文字を越えています。
Bq Er ENOENT
新しいプロセスファイルが存在しません。
Bq Er ELOOP
パス名を変換するときに検出されたシンボリックリンクが多すぎます。
Bq Er EACCES
指定されたパスには、検索が許可されていないディレクトリが含まれています
Bq Er EACCES
新しいプロセスファイルが通常のファイルではありません。
Bq Er EACCES
新しいプロセスファイルは、実行が許可されていません。
Bq Er ENOEXEC
新しいプロセスファイルに適切なアクセス許可がありますが、 ヘッダのマジック番号が無効です。
Bq Er ETXTBSY
新しいプロセスファイルは純粋な手続き (共有テキスト) ファイルで、 現時点で他のプロセスによって書込みまたは読取り用にオープンされています。
Bq Er ENOMEM
新しいプロセスは、許された (getrlimit(2) ) で課された最大値 以上の仮想メモリを必要とします。
Bq Er E2BIG
新しいプロセスの引数リストのバイト数がシステムの課した上限を 越えています。 この上限は、 sysctl(3) の MIB 変数 KERN_ARGMAX により指定されます。
Bq Er EFAULT
新しいプロセスファイルは、ヘッダ内のサイズ値で 示されるほど長くはありません。
Bq Er EFAULT
Fa path , Fa argv , または Fa envp 引数が正しくないアドレスを指しています。
Bq Er EIO
ファイルシステムから読み取る間に入出力エラーが発生しました。

 

索引

警告

スーパユーザでないものに対して setuid されたプログラムが、実 uid が ``root'' の時に実行された場合、プログラムは部分的に スーパユーザの権限を持ちます。  

索引

関連項目

ktrace(1), _exit2, fork(2), execl(3), exit(3), sysctl(3), a.out5, elf(5), environ(7), mount(8)  

索引

規格

Fn execve システムコールは、特定の状況において記述子 0, 1 そして/または 2 を 再度オープンする他は、 St -p1003.1-2001 に適合しています。 将来規格が更新される際には、このような動作を要求することが期待されており、 権限を持たないプロセスに対しても、これがデフォルトとなるかもしれません。 インタプリトされるプログラムの実行をサポートしているのは、拡張です。  

索引

歴史

Fn execve システムコールは BSD 4.2 で登場しました。


 

索引

Index

名称
ライブラリ
書式
解説
戻り値
エラー
警告
関連項目
規格
歴史

jman



Time: 07:06:25 GMT, January 12, 2009