EXECVE(2) — NEWS-OS Programmer’s Manual
名称
execve − ファイルを実行する
形式
execve(name, argv, envp)
char ∗name, ∗argv[], ∗envp[];
解説
execve は、 呼び出し元のプロセスを 新しいプロセスに変えます。 新しいプロセスは、 new process file と呼ばれる 1 個のレギュラファイルから構成されます。 このファイルは、 実行可能なオブジェクトファイル、 またはインタープリタのためのデータのファイルのいずれかです。 実行可能なオブジェクトファイルは、 ヘッダ ID と、 そのあとに続く、 初期プログラム (テキスト) を 表現しているデータのページと初期化データのページから構成されています。 ヘッダ の指定により、 追加のページを ゼロのデータで初期化されるように指定することができます。 a.out(5) を 参照してください。
インタープリタファイルは、 形式 "#! interpreter" の行で始まっています。 インタープリタファイルが execve されるとき、 システムは、 本来 exec されるファイルの名前を 引数として与え、 元の引数の残りを 取り去って、 指定された interpreter を execve します。
呼び出し元のコアイメージは失われているので、 成功した execve からのリターン値はないはずです。 これが異なるプロセスイメージがアクティブになるメカニズムです。
引数 argv は、 ナルで終わっている文字列を 指し示すキャラクタポインタのナルで終わっている配列です。 これらの文字列は、 新しいプロセスにとって使用可能にされる引数リストを 構成します。 規約によって、 この配列内には少なくとも 1 つの引数がなければならず、 この配列の先頭の要素は、 実行されるプログラムの名前 (すなわち、 name の最後の構成要素) である必要があります。
引数 envp も、 ナルで終わっている文字列を 指し示すキャラクタポインタのナルで終わっている配列です。 これらの文字列は、 直接にコマンドへの引数にはなっていない情報を、 新しいプロセスへ渡します ( environ(7) 参照)。
呼び出し元プロセスでオープンになっているディスクリプタで exec 時 クローズフラグがセットされている ( close(2) 参照) もの以外は、 新しいプロセスでもオープンされたままになります。 オープンのままになるディスクリプタは、 execve によって影響を 及ぼされません。
無視されるシグナルは execve の実行後も無視されますが、 キャッチされるシグナルはデフォルト値にリセットされます。 ブロックされるシグナルは、 そのシグナルのアクションに対する変更に関係なく、 execve の実行後も ブロックされます。 シグナルスタックは未定義にリセットされます (詳細は sigvec(2) 参照)。
各プロセスは、 実 ユーザ/グループ ID、 有効 ユーザ ID/グループ ID を 持っています。 実 ID はシステムを使用している人を識別し、 有効 ID はその人のアクセス権を決定します。 execve は、 ファイルが “セットユーザ ID” または “セットグループ ID” モードを 有している場合には、 有効ユーザおよび有効グループ ID を 実行されるファイルの所有者に変更します。 実 ユーザ ID は影響を 受けません。
新しいプロセスは、呼び出し元プロセスから次の属性も受け継ぎます。
プロセス IDgetpid(2)参照
親プロセス IDgetppid(2)参照
プロセスグループ IDgetpgrp(2)参照
アクセスグループgetgroups(2)参照
ワーキングディレクトリchdir(2)参照
ルートディレクトリchroot(2)参照
制御端末装置tty(4)参照
リソースの使用法getrusage(2)参照
インターバルタイマgetitimer(2)参照
リソースの制限getrlimit(2)参照
ファイルモードマスクumask(2)参照
シグナルマスクsigvec(2),sigmask(2)参照
実行されるプログラムを 開始するときには、 次のように呼び出されます。
main(argc, argv, envp)
int argc;
char ∗∗argv, ∗∗envp;
ここで、 argc は、 argv 内の要素の数 (“arg count”) であり、 argv は、 引数自体を 指し示すキャラクタポインタの配列です。
envp は、 プロセスの environment を 構成する文字列の配列を 指し示すポインタです。 この配列へのポインタは、 グローバル変数“environ”にもあります。 各文字列は、 1 つの名前、 1 つの “=”、 およびナルで終了する 1 つの値から構成されます。 ポインタの配列は ナルポインタで終わっています。 シェル sh(1) は、 プログラムが呼び出されたときに、 定義されている各グローバルシェル変数の環境エントリを 渡します。 慣例的に使用される名前については、 environ(7) を 参照してください。
リターン値
execve が呼び出し元プロセスへ戻った場合は、 エラーが発生しています。 その場合、 リターン値は −1 で、 グローバル変数 errno にはエラーコードが入れられます。
エラー
以下に示されている項目のうち、1 つ以上が真である場合には、 execve は失敗し、 呼び出し元プロセスへ戻ります。
[ENOTDIR] パスプレフィックスの構成要素がディレクトリではないものがある。
[EINVAL] パス名に最上位ビットのセットされたキャラクタが含まれている。 (NEWS-OS では、このエラーはおきない。)
[ENAMETOOLONG]
パス名の 1 構成要素が 255 バイトを 超えている、 またはパス名全体が 1023 バイトを 超えている。
[ENOENT] 新しいプロセスファイルが存在していない。
[ELOOP] パス名の処理で遭遇したシンボリックリンクの数が多すぎる。
[EACCES] パスプレフィックスの構成要素についてサーチパーミッションが 許されていないものがある。
[EACCES] 新しいプロセスファイルが普通のファイルではない。
[EACCES] 新しいプロセスファイルのモードの実行パーミッションがない。
[ENOEXEC] 新しいプロセスファイルは適切なアクセスパーミッションを 有しているが、 そのヘッダ内に無効なマジック番号がある。
[ETXTBSY] 新しいプロセスファイルは、 あるプロセスによる書き込みと読み取りのために現在オープンされている 純プロシージャ (共有テキスト) ファイルである。
[ENOMEM] 新しいプロセスが、 課せられている最大値で許されている量 ( getrlimit(2)) よりも多くの仮想メモリを 要求している。
[E2BIG] 新しいプロセスの引数リストのバイト数が、 システムによって課せられている制限値を 超えている。 リリース時のシステムにおける制限値は 20480 バイトである (<sys/param.h> 内の NCARGS )。
[EFAULT] 新しいプロセスファイルが、 そのヘッダ内のサイズ値で示されている長さではない。
[EFAULT] path または argv、 envp が認められないアドレスを 指している。
[EIO] ファイルシステムからの読み取りを 行っている間に入出力エラーが発生した。
警告
プログラムのユーザ ID がスーパーユーザ以外に setuid されていても、 実ユーザ ID が“root”であるときに実行されると、 そのプログラムはスーパーユーザの権限のいくつかも持ちます。
関連事項
exit(2), fork(2), execl(3), environ(7)
NEWS-OSRelease 4.2.1R