spawnl,spawnle,spawnlp,spawnlpe,spawnv,spawnve,spawnvp,spawnvpe,_wspawnl,_wspawnle,_wspawnlp,_wspawnlpe,_wspawnv,_wspawnve,_wspawnvp,_wspawnvpe

提供: RAD Studio
移動先: 案内検索

process.h:インデックス への移動


ヘッダーファイル

process.h

カテゴリ

プロセス制御ルーチン

プロトタイプ

int spawnl(int mode, char *path, char *arg0, arg1, ..., argn, NULL);

int _wspawnl(int mode, wchar_t *path, wchar_t *arg0, arg1, ..., argn, NULL);

int spawnle(int mode, char *path, char *arg0, arg1, ..., argn, NULL, char *envp[]);

int _wspawnle(int mode, wchar_t *path, wchar_t *arg0, arg1, ..., argn, NULL, wchar_t *envp[]);

int spawnlp(int mode, char *path, char *arg0, arg1, ..., argn, NULL);

int _wspawnlp(int mode, wchar_t *path, wchar_t *arg0, arg1, ..., argn, NULL);

int spawnlpe(int mode, char *path, char *arg0, arg1, ..., argn, NULL, char *envp[]);

int _wspawnlpe(int mode, wchar_t *path, wchar_t *arg0, arg1, ..., argn, NULL, wchar_t *envp[]);

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

int _wspawnv(int mode, wchar_t *path, wchar_t *argv[]);

int spawnve(int mode, char *path, char *argv[], char *envp[]);

int _wspawnve(int mode, wchar_t *path, wchar_t *argv[], wchar_t *envp[]);

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

int _wspawnvp(int mode, wchar_t *path, wchar_t *argv[]);

int spawnvpe(int mode, char *path, char *argv[], char *envp[]);

int _wspawnvpe(int mode, wchar_t *path, wchar_t *argv[], wchar_t *envp[]);

メモ:  spawnle,spawnlpe,spawnv,spawnve,spawnvp,および spawnvpe では,最後の文字列が NULL でなければなりません。

説明

spawn... 系の関数は,子プロセスと呼ばれるほかのファイルを作成して実行します。子プロセスを読み込みおよび実行できるだけの十分なメモリが必要です。

mode の値は,呼び出し側の関数(親プロセス)が spawn... の呼び出し後に実行するアクションを決定します。次の表に,mode に指定できる値を示します。

P_WAIT

子プロセスの実行が完了するまで,親プロセスを一時停止状態にします。

P_NOWAIT

子プロセスを実行しながら,親プロセスを続行します。親プロセスが cwait または wait を使って子プロセスの完了を待つことができるように,子プロセスの ID が返されます。

P_NOWAITO

子プロセスの ID がオペレーティングシステムによって保存されない点が異なる以外は,P_NOWAIT と同じです。そのため,親プロセスは,cwait または wait を使って子プロセスの完了を待つことができません。

P_DETACH

子プロセスがバックグラウンドで実行され,キーボードやディスプレイにアクセスできない点が異なる以外は,P_NOWAITO と同じです。

P_OVERLAY

それまで親プロセスが占有していたメモリ位置で子プロセスをオーバーレイします。exec... の呼び出しと同じです。



path は,呼び出される子プロセスのファイル名です。spawn... 系関数の呼び出しは,オペレーティングシステムの標準の検索アルゴリズムを使って次のようにパスを検索します。

  • 拡張子もピリオドもない場合は,そのファイル名で検索を行います。ファイルが見つからない場合は,最初に拡張子 EXE を持つファイルを検索し,次に拡張子 COM を持つファイル,最後に拡張子 BAT を持つファイルを検索します。
  • 拡張子が指定されている場合は,そのファイル名だけを検索します。
  • ピリオドだけが指定されている場合は,拡張子がないファイル名だけを検索します。
  • パスに明示的なディレクトリが含まれない場合,p サフィックスを持つ spawn... 系関数は,現在のディレクトリを検索した後,オペレーティングシステムの PATH 環境変数で設定されているディレクトリを検索します。

spawn... 系関数の名前にサフィックス p,l,v,e が付いている場合は,その関数が特定の機能を使用することを示します。

p 関数は,PATH 環境変数で指定されているディレクトリでファイルを検索します。p サフィックスなしの関数は,現在の作業ディレクトリだけを検索します。 l 引数ポインタ(arg0,arg1,...,argn)が個別の引数として渡されます。通常,l サフィックスは,渡される引数の個数が事前にわかっている場合に使用されます。 v 引数ポインタ(argv[0],...,arg[n])がポインタの配列として渡されます。通常,v サフィックスは,可変個の引数が渡されるときに使用されます。 e 引数 envp を子プロセスに渡して子プロセスの環境を変更できます。e サフィックスなしの場合,子プロセスは親プロセスの環境を継承します。



spawn... 系の関数は,引数指定サフィックス l または v のいずれかを持つ必要があります。パス検索(p)と環境継承(e)のサフィックスは任意です。

例を示します。

  • spawnl は,引数を個別に受け取り,子プロセスを現在のディレクトリでのみ検索し,親プロセスの環境を子プロセスに渡します。
  • spawnvpe は,引数ポインタの配列を受け取り,子プロセスの検索で PATH を使用し,子プロセスの環境を変更する envp 引数を受け付けます。

spawn... 系関数は,子プロセスに引数を少なくとも 1 つ(arg0 または argv[0])渡す必要があります。この引数は,慣例として path のコピーです。ただし,この 0 番めの引数に別の値を使用しても,エラーは発生しません。子プロセスに空の引数リストを渡す場合は,arg0 または argv[0] を NULL にします。

l サフィックスが使用される場合は,通常,arg0 が path を指し,arg1 ~ argn が新しい引数リストとなる文字列を指します。argn の後には,リストの最後を示す NULL が必要です。

e サフィックスが使用される場合は,引数 envp によって新しい環境設定リストを渡します。この環境引数は,文字ポインタの配列です。配列の各要素は,次の形式のヌルで終わる文字列へのポインタです。

envvar = value

ここで,envvar は環境変数の名前,value は envvar に設定する文字列値です。envp[] の最後の要素は NULL です。envp が NULL の場合,子プロセスは親プロセスの環境設定を継承します。

arg0 + arg1 + ... ... + argn(または argv[0] + argv[1] + ... ... + argv[n])を合わせた長さは,引数を区切る空白文字も含めて,Windows では 260 バイト未満(DOS では 128 バイト未満)でなければなりません。ヌルターミネータはカウントされません。

spawn... 系関数を呼び出した場合,子プロセスのオープンファイルは開いたままになります。

戻り値

成功した場合,P_WAIT モードの spawn... 系関数は,子プロセスの終了状態(正常終了の場合は 0)を返します。子プロセスが 0 以外の引数で明示的に exit を呼び出す場合,終了状態は 0 以外の値に設定されます。

P_NOWAIT または P_NOWAITO モードの spawn... 系関数は,子プロセスのプロセス ID を返します。P_NOWAIT を使用する場合は,取得した ID を cwait に渡すことができます。

エラーが発生した場合は -1 を返し,グローバル変数 errno に次のいずれかの値が設定されます。

E2BIG

引数リストが長すぎる

EINVAL

無効な引数

ENOENT

パスまたはファイル名が見つからない

ENOEXEC

実行フォーマットエラー

ENOMEM

メモリが不十分





 #include <process.h>
 #include <stdio.h>
 void spawnl_example(void)
 {
    int result;
    result = spawnl(P_WAIT, "bcc32.exe", "bcc32.exe", NULL);
    if (result == -1)
    {
       perror("Error from spawnl");
       exit(1);
    }
 }
 int main(void)
 {
   spawnl_example();
   return 0;
 }