exec, execl, execlp, execv, execvp, execle, execlpe, execve, execvpe
- プロセスの実行
【書式】
#include <stdlib.h> or <process.h>
int execl(const char *prog, ...);
int execlp(const char *prog, ...);
int execv(const char *prog, const char *const argv[]);
int execvp(const char *prog, const char *const argv[]);
int execle(const char *prog, ..., char *envp[]);
int execlpe(const char *prog, ..., char *envp[]);
int execve(const char *prog, const char *const argv[], const char
*const envp[]);
int execvpe(const char *prog, const char *const argv[], const char
*const envp[]);
【解説】
exec(3) 一族の関数である execl(), execlp(), execv(), execvp(),
execle(), execlpe(), execve(), execvpe() は、子プロセスを生成して実
行します。ただしspawn(3)とは異なり、制御は戻ってきません。
文字列progには実行すべきファイル名を与えます。ファイル名が拡張子を持
たない場合には、execはまず.comを探し、次に.exeを探します。
起動されるプログラムには、パラメタを渡すことができます。パラメタは文
字列、 すなわち char 型へのポインタでなくてはいけません。 execl(),
execlp(), execle(), execlpe()では、第2パラメタ以降にパラメタを並べて
渡します。execv(), execvp(), execve(), execvpe()では、文字型へのポイ
ンタの配列argv の中にパラメタを設定します。 パラメタの終わりの印とし
て、最後に必ずNULLを渡してください。コマンドラインの長さはDOS窓によ
って128文字までに制限されています。
また、execle(), execlpe(), execve(), execvpe() 関数には、環境変数文
字列の配列envpを渡すことができます。
execl(), execv(), execle(), execve()は、指定されたパス名のファイルを
探して、 見つからなかったときにはプログラムの実行をあきらめます。
execlp(), execvp(), execlpe(), execvpe()は、指定されたファイルが見つ
からなかったときには環境変数 PATH 中のディレクトリを順に探しにいきま
す。
以上をまとめると、関数名のexecに続く文字で関数の動作を規定することが
できます。
l
コマンドラインパラメタを並べて渡します
v
コマンドラインパラメタを配列で渡します
p
環境変数PATHを使って実行ファイルを探します
e
子プロセスに環境変数の配列を渡します
execを呼び出したときにオープンされていたファイルは、子プロセスが実行
を開始したときにもオープンされたままになっています。必要であればexec
を呼び出す前にファイルをクローズしてください。
【使用例】
次の例はプログラムfoo.exeを起動して、bar, zodというパラメタを与えま
す。
execl("foo.exe", "foo.exe", "bar", "zod", NULL);
ここで
char *argv[4];
argv[0] = "foo.exe";
argv[1] = "bar";
argv[2] = "zod";
argv[3] = NULL;
となっている場合、次のexecv()の呼び出しは上記のexecl()の呼び出しと等
価です。
execv("foo.exe", argv);
【環境変数】
PATH
プログラムのサーチパスを指定します
【リターン値】
プログラムの実行に成功したときは、制御は戻ってきません。実行に失敗し
たときはerrnoをセットして-1を返します。
【エラー】
ENOENT
プログラムが見つかりません
E2BIG
コマンドラインが長すぎます
ENOMEM
プログラムの実行に必要な空きメモリがありません
ENOEXEC
progが実行可能フォーマットではありません
【可搬性】
UNIX, DOS窓
【参照】
abort(3), environ(3), exit(3), spawn(3)
【バグ】
子プロセスに環境を渡す関数(execle(), execlpe(), execve(), execvpe())
においては環境変数``COMSPEC=...''を必ず与えてください。 これを忘れる
と DOS窓がCOMMAND.COMをリロードできずに暴走する可能性があります。こ
れはDOS窓の制限です。
【copyright (c) 安江正樹@東海大学理学部物理学科】