spawn, spawnl, spawnlp, spawnv, spawnvp, spawnle, spawnlpe, spawnve, spawnvpe - 子プロセスの実行

【書式】

#include <stdlib.h>

#include <process.h>

int spawnl(int mode, const char *prog, ...);

int spawnlp(int mode, const char *prog, ...);

int spawnv(int mode, const char *prog, const char *const argv[]);

int spawnvp(int mode, const char *prog, const char *const argv[]);

int spawnle(int mode, const char *prog, ..., char *envp[]);

int spawnlpe(int mode, const char *prog, ..., char *envp[]);

int spawnve(int mode, const char *prog, const char *const argv[],

const char *const envp[]);

int spawnvpe(int mode, const char *prog, const char *const argv[],

const char *const envp[]);

【解説】

spawn(3)一族の関数であるspawnl(), spawnlp(), spawnv(), spawnvp(),

spawnle(), spawnlpe(), spawnve(), spawnvpe()は、子プロセスを生成して

実行します。

modeには<process.h>で定義されている定数P_WAITあるいはP_OVERLAYを指定

します。P_WAITを指定すると子プロセスの実行が終了するまで親プロセスは

停止します。 子プロセスが終了すると spawn からリターンしてきます。

P_OVERLAYを指定するとexec(3)と等価になります。詳しくはexec(3) を参照

してください。

文字列progには実行すべきファイル名を与えます。ファイル名が拡張子を持

たない場合には、spawnはまず.comを探し、次に.exeを探します。

起動されるプログラムには、パラメタを渡すことができます。パラメタは文

字列、すなわちchar型へのポインタでなくてはいけません。

spawnl(), spawnlp(), spawnle(), spawnlpe() では、第2パラメタ以降にパ

ラメタを並べて渡します。

spawnv(), spawnvp(), spawnve(), spawnvpe() では、パラメタはcharへの

ポインタの配列argvの中に設定します。

パラメタの終わりの印として、最後に必ずNULLを渡してください。コマンド

ラインの長さはDOS窓によって128文字までに制限されています。

また、spawnle(), spawnlpe(), spawnve(), spawnvpe()関数には、環境変数

文字列の配列envpを渡すことができます。

spawnl(), spawnv(), spawnle(), spawnve()は、指定されたパス名のファイ

ルを探して、見つからなかったときにはプログラムの実行をあきらめます。

spawnlp(), spawnvp(), spawnlpe(), spawnvpe() は、指定されたファイル

が見つからなかったときには環境変数PATH中のディレクトリを順に探しにい

きます。

以上をまとめると、 関数名のspawnに続く文字で関数の動作を規定すること

ができます。

l

コマンドラインパラメタを並べて渡します

v

コマンドラインパラメタを配列で渡します

p

環境変数PATHを使って実行ファイルを探します

e

子プロセスに環境変数の配列を渡します

spawn を呼び出したときにオープンされていたファイルは、子プロセスが実

行を開始したときにもオープンされたままになっています。 必要であれば

spawnを呼び出す前にファイルをクローズしてください。

【使用例】

次の例はプログラムfoo.exeを起動して、bar, zodというパラメタを与えま

す。

spawnl(P_WAIT, "foo.exe", "foo.exe", "bar", "zod", NULL);

ここで

char *argv[4];

argv[0] = "foo.exe";

argv[1] = "bar";

argv[2] = "zod";

argv[3] = NULL;

となっている場合、次のspawnv()の呼び出しは上記のspawnl()の呼び出しと

等価です。

spawnv(P_WAIT, "foo.exe", argv);

【環境変数】

PATH

プログラムのサーチパスを指定します

【リターン値】

子プロセスの終了コードを返します。実行に失敗したときはerrno をセット

して-1を返します。

【エラー】

ENOENT

プログラムが見つかりません

E2BIG

コマンドラインが長すぎます

ENOMEM

子プロセスの実行に必要な空きメモリがありません

EINVAL

modeに許されない値を渡しました

ENOEXEC

progが実行可能フォーマットではありません

【可搬性】

DOS窓

【参照】

abort(3), environ(3), exec(3), exit(3), system(3)

【バグ】

子プロセスに環境を渡す関数 (spawnle(), spawnlpe(), spawnve(),

spawnvpe()) では、環境変数``COMSPEC=...''を必ずあたえてください。こ

れをあたえない場合には、DOS窓がCOMMAND.COM をリロードできずに暴走す

る可能性があります。これはDOS窓の制限です。

【copyright (c) 安江正樹@東海大学理学部物理学科】