スポンサーリンク

EXECVE(2) FreeBSD システムコールマニュアル EXECVE(2)

名称

execve − ファイルを実行する

ライブラリ

標準 C ライブラリ (libc, −lc)

書式

#include <unistd.h>

int

execve(const char *path, char *const argv[], char *const envp[]);

解説

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

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

#! interpreter [arg]

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

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

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

呼び出しプロセスイメージ内でオープンされているファイル記述子は、新しいプ ロセスイメージの中でもオープンされたままです。しかし、close-on-exec フラ グが設定されているものは例外です。 (close(2)fcntl(2) を参照)。オープ ンされたままの記述子は execve() の影響を受けません。 execve() が呼び出さ れた時に標準の記述子 (0, 1 そして / または 2) がクローズされ、 ID 設定の 結果、そのプロセスが特権を得た場合には、それらの記述子は自動的にオープン されます。特権を持っているかどうかに関わらず、どのプログラムも 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 getpid(2) を参照
親プロセス ID getppid(2) を参照
プロセスグループ ID getpgrp(2) を参照
アクセスグループ getgroups(2) を参照
作業ディレクトリ chdir(2) を参照
ルートディレクトリ chroot(2) を参照
制御端末 termios(4) を参照
リソースの使用状況 getrusage(2) を参照
インターバルタイマ getitimer(2) を参照
リソースの使用制限 getrlimit(2) を参照
ファイルモードマスク umask(2) を参照
シグナルマスク sigvec(2), sigsetmask(2) を参照

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

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

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

戻り値

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

エラー

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

       [ENOTDIR]

パスの構成要素中にディレクトリ以外のものが含まれていま す。

[ENAMETOOLONG]
パス名の構成要素が 255 文字を越えているか、またはパス 名全体が 1023 文字を越えています。

[ENAMETOOLONG]
インタプリトされるスクリプトを起動するときに、インタプ リタの名前が MAXSHELLCMDLEN 文字を越えています。

[ENOENT]
新しいプロセスファイルが存在しません。

[ELOOP]
パス名を変換するときに検出されたシンボリックリンクが多 すぎます。

[EACCES]
指定されたパスには、検索が許可されていないディレクトリ が含まれています

[EACCES]
新しいプロセスファイルが通常のファイルではありません。

[EACCES]
新しいプロセスファイルは、実行が許可されていません。

[ENOEXEC]
新しいプロセスファイルに適切なアクセス許可があります が、ヘッダのマジック番号が無効です。

[ETXTBSY]
新しいプロセスファイルは純粋な手続き (共有テキスト) ファイルで、現時点で他のプロセスによって書込みまたは読 取り用にオープンされています。

[ENOMEM]
新しいプロセスは、許された (getrlimit(2)) で課された最 大値以上の仮想メモリを必要とします。

[E2BIG]
新しいプロセスの引数リストのバイト数がシステムの課した 上限を越えています。この上限は、 sysctl(3) の MIB 変数 KERN_ARGMAX により指定されます。

[EFAULT]
新しいプロセスファイルは、ヘッダ内のサイズ値で示される ほど長くはありません。

[EFAULT]
path
, argv, または envp 引数が正しくないアドレスを指し ています。

[EIO]
ファイルシステムから読み取る間に入出力エラーが発生しま した。

警告

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

関連項目

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

規格

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

歴史

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

FreeBSD 10.0 June 1, 1994 FreeBSD 10.0

スポンサーリンク