exec関数の概要
exec関数群は、
Unix系オペレーティングシステムにおいて、実行中の
プロセスを新しいプログラムに置き換えるための機能を提供します。この置き換えは、新しい
プロセスを生成するのではなく、既存の
プロセスが完全に新しいプログラムのイメージで上書きされる形で行われます。そのため、
プロセス識別子(PID)は変化しませんが、
プロセスの仮想メモリ空間(スタック、ヒープ、データ領域など)は新しいプログラムのものに置き換えられます。
環境変数とファイル記述子の扱い
exec関数群を実行する際、`execl`、`execlp`、`execv`、`execvp`などの関数は、新しい
プロセスイメージに現在の
環境変数を継承します。また、exec関数を呼び出す前に開かれていたファイルは、新しい
プロセスイメージでもそのままオープンされた状態を維持します。この特性を利用して、新しい
プロセスの標準入力(stdin)、標準出力(stdout)、標準エラー出力(stderr)を事前に設定することが可能です。
MS-DOS環境でexec関数群を使用してプログラムを実行する場合、
実行ファイルのヘッダに設定された「maximum allocation」の値(デフォルトでは0xFFFF)がメモリロードに影響を与えることがあります。EXEHDRユーティリティでこの値を変更した場合、exec関数による実行と、コマンドラインやspawn系関数による実行でプログラムの動作が異なる場合があります。
シェルにおけるexecコマンド
多くの
Unixシェルには、組み込みコマンドとして`exec`が用意されています。このコマンドは、現在のシェル
プロセスを指定されたプログラムで上書きします。この機能は、
環境変数を設定したり、実際には別のプログラムを実行したりするラッパースクリプトでよく使用されます。`exec`を使用すると、実行したいプログラムが起動した時に、シェルが使用していたリソースを解放できます。
exec関数のプロトタイプ
exec関数群は、
POSIX標準では`unistd.h`ヘッダファイルで、DOS、OS/2、Windowsでは`process.h`ヘッダファイルで宣言されています。以下に、主なexec関数のプロトタイプを示します。
c
int execl(char const path, char const arg0, ...);
int execle(char const path, char const arg0, ..., char const const envp);
int execlp(char const file, char const arg0, ...);
int execv(char const path, char const const argv);
int execve(char const path, char const const argv, char const const envp);
int execvp(char const file, char const const *argv);
実装によっては、関数名の先頭にアンダースコアが付くことがあります(例:`_execl`)。現代のUnixシステムでは、最も汎用的な`execve`が
システムコールとして実装されており、他のexec関数は`execve`を呼び出すライブラリ関数として提供されるのが一般的です。
関数名の意味
各exec関数の名前は、`exec`(execute:実行)を基本とし、以下の接尾辞によって機能が区別されています。
- - `e`: 環境変数群へのポインタ配列を明示的に新しいプロセスイメージに渡します。
- - `l`: コマンドライン引数群を個々の関数引数として渡します。
- - `p`: `file`引数で指定された実行ファイルの場所を、環境変数`PATH`を利用して検索します。
- - `v`: コマンドライン引数群をポインタ配列として関数に渡します。
引数の詳細
- - `path`: 新しいプロセスイメージとして実行するファイルのパス名を指定します。
- - `file`: 新しいプロセスイメージとして実行するファイルのパス名を指定します。ただし、スラッシュが含まれない場合は環境変数`PATH`を利用してパスを検索します。
- - `arg0`: 実行ファイルの名前(へのポインタ)であり、`arg0`から始まる引数のポインタが続きます。通常は`path`または`file`と同じ値が設定されますが、`arg0`を使って自身の位置を特定するプログラムでは、その正確性は保証されません。
- - `argv`: 新しいプロセスイメージに渡す引数群へのポインタ配列です。
- - `envp`: 環境変数群のポインタ配列です。この配列は、`name=value`形式の文字列へのポインタで構成され、最後にNULLポインタが置かれます。`envp`がNULLの場合、現在の環境変数をそのまま新しいプロセスイメージに継承します。
戻り値
exec関数は、通常、現在の
プロセスを新しい
プロセスに置き換えるため、呼び出し元の
プロセスに値を返すことはありません。
プロセスの
終了ステータスは、親
プロセスが取得します。
exec関数が呼び出し元に戻る場合は、エラーが発生した場合のみであり、この時の戻り値は-1です。エラーが発生した場合、`errno`にはエラーを示す値が設定されます。
関連事項
外部リンク