execve(2) FreeBSD 一般コマンドマニュアル

execve

前のページ 上に戻る 次のページ

execve




書式

     #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() の影響を受けません。

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

     ん。実効 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 システムコールとして実装さ
     れています。

     スレッドライブラリでは、 execve システムコールは _thread_sys_execve() に
     アセンブルされ、 execve() は、ユーザスレッドライブラリ再初期化を行なって
     から、 _thread_sys_execve() を呼び出す関数として実装されています。


戻り値

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


エラー

     次の場合、 execve() は処理に失敗し、呼び出しプロセスに戻ります。

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

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

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

                        ファイルで、現時点で他のプロセスによって書込みまたは読
                        取り用にオープンされています。

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

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

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

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

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


警告

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


関連項目

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


歴史

     execve() 関数は 4.2BSD で登場しました。

FreeBSD 4.4                      June 1, 1994                      FreeBSD 4.4

ABELNET VPSサービス