_spawn 系関数と _wspawn 系関数
_spawn の関数は、新しいプロセスを作成して実行する:
関数名の最後の文字はの種類を示します。
e
envpの環境設定へのポインターの配列が新しいプロセスに渡されます。l
コマンド ライン引数が _spawn 関数に個別に渡されます。 このサフィックスは、新しいプロセスにいくつかのパラメーターが事前にわかっている場合に使用されます。p
PATH 環境変数を使用して、実行するファイルを検索します。v
argvのコマンド ライン引数へのポインターの配列は _spawn 関数に渡されます。 このサフィックスは、新しいプロセスにいくつかのパラメーターが変数に使用されます。
解説
_spawn は個別に作成し、実行する新しいプロセスを使用します。 チームは適切な方法で自動的にマルチバイト文字列の引数を処理しま、現在使用中のマルチバイト コード ページに従ってマルチバイト文字列を認識します。 _wspawn 関数は _spawn 関数のワイド文字バージョンであり、; これらはマルチバイト文字を処理しません。 それ以外の場合は _wspawn 関数は _spawn の対応と同様に動作します。
汎用テキスト ルーチンのマップ
Tchar.h のルーチン |
_UNICODE および _MBCS が未定義の場合 |
_MBCS が定義されている場合 |
_UNICODE が定義されている場合 |
---|---|---|---|
_tspawnl |
_spawnl |
_spawnl |
_wspawnl |
_tspawnle |
_spawnle |
_spawnle |
_wspawnle |
_tspawnlp |
_spawnlp |
_spawnlp |
_wspawnlp |
_tspawnlpe |
_spawnlpe |
_spawnlpe |
_wspawnlpe |
_tspawnv |
_spawnv |
_spawnv |
_wspawnv |
_tspawnve |
_spawnve |
_spawnve |
_wspawnve |
_tspawnvp |
_spawnvp |
_spawnvp |
_wspawnvp |
_tspawnvpe |
_spawnvpe |
_spawnvpe |
_wspawnvpe |
十分なメモリが新しいプロセスを読み込み、実行時に使用できる必要があります。 mode の引数は _spawnの前および中に呼び出しプロセスによって実行されるアクションを決定します。 mode の値は Process.h で定義されています:
_P_OVERLAY
呼び出しプロセス (_exec が呼び出すのと同じ) をオーバーレイする効果を破棄する新しいプロセスと呼び出しプロセスについて説明します。_P_WAIT
新しいプロセスの実行が完了するまで呼び出し元スレッドを中断します (同期 _spawn)。_P_NOWAIT または _P_NOWAITO
新しいプロセス (非同期 _spawn) する呼び出しプロセスを継続します。_P_DETACH
呼び出しプロセスを継続します; 新しいプロセスはコンソールまたはキーボードにアクセスせずにバックグラウンドで動作します。 新しいプロセスに対する _cwait への呼び出しが失敗した (非同期 _spawn)。
cmdname の引数は、新しいプロセスとして実行され、完全パス (ルートからのパス)、相対パス (現在の作業ディレクトリから)、またはファイル名だけを指定するファイルを指定します。 次に cmdname にファイル名の拡張子がない場合、ピリオド () 関数は _spawn 関数は最初に .com のファイル名拡張子とファイル名拡張子 .exe、.bat ファイル名拡張子および finally .cmd ファイル名拡張子を試みます。
cmdname にファイル名の拡張子がある場合は、その拡張子だけが使用されます。 cmdname にピリオドがある場合、_spawn の呼び出しは、ファイル名拡張子を除いた cmdname を検索します。 _spawnlp、_spawnlpe、_spawnvpと_spawnvpe 関数は PATH 環境変数で指定されたディレクトリで cmdname (同じ手順を使用して) を検索します。
cmdname がドライブ指定子やスラッシュが、つまり相対パスが含まれている場合、_spawn の呼び出しは指定のファイルだけを検索し、; パスの検索は行われません。
これまで、これらの関数の一部が成功の errno をゼロに設定された; 現在の動作は C 規格で指定された触れられていない成功に errno を残しておくことです。 古い動作をエミュレートする必要がある場合、これらの関数を呼び出す直前の errno をゼロに設定します。
注意
適切なオーバーレイ初期化と終了を確認するために、オーバーレイ ルーチンを入力するか、そのために setjmp または longjmp の関数を使用しないでください。
起動されたプロセスの引数
新しいプロセスに引数を渡すには、文字列へのポインターを _spawn の呼び出しの引数を指定します。 これらの文字列が起動されたプロセスの引数リストとなります。 新しいプロセスの引数リストを構成する文字列を組み合わせた長さが 1024 バイトを超えないようにしてください。 各文字列の終端の null 文字 (「\0 ") はカウントされませんが、空白文字 (自動的に別の引数に挿入される) 含まれています。
注意
文字列に空白が含まれる場合、予期しない動作が発生することがあります; たとえば、_spawn"hi there" に文字列を渡すと、2 番目 "hi" と "there"を取得する新しいプロセスになります。新しいプロセスでは "hi there" というファイルを開こうとするため、プロセスは失敗します。この問題を回避するには、"\"hi there\"" のように文字列を引用符で囲みます。
セキュリティに関するメモ |
---|
ユーザー入力のコンテンツを明示的にチェックしないまま _spawn に渡さないでください。_spawn によって CreateProcess が呼び出されます。そのため、パス名が修飾されていない場合、セキュリティ上の脆弱性につながる可能性があります。 |
個別の引数として引数のポインター (_spawnl、_spawnle、_spawnlp、ポインターの配列として _spawnlpe) または渡すことができます (_spawnv、_spawnve、_spawnvpと _spawnvpe)。 起動されたプロセスに 1 個以上の引数、arg0 または argv0 []、渡す必要があります。 通常、この引数はコマンド ラインに入力するため、プログラムの名前です。 異なる値はエラーは発生しません。
引数の数が事前にわかっている場合 _spawnl、_spawnle、_spawnlpと _spawnlpe の呼び出しがよく使用されます。 arg0 引数は通常、cmdname へのポインターです。 引数 arg1 ~ argn は、新しい引数リストを構成する文字列へのポインターです。 argn の後には、引数リストの末尾を示すために NULL ポインターが必要です。
引数の数が新しいプロセスにある場合 _spawnv、_spawnve、_spawnvpと _spawnvpe の呼び出しは便利です。 引数へのポインターは、配列 argvとして渡されます*。*argv[0] 引数は、通常、リアル モードのパスまたは保護モードのプログラム名へのポインターです。argv[1] 引数~ argv[n] 引数は、新しい引数リストを形成する文字列へのポインターです。 引数リストの末尾を示すために、argv[n+1] 引数は NULL ポインターである必要があります。
起動されたプロセスの環境
_spawn が呼び出されたときに開いているファイルは、新しいプロセスで開いたままになります。 _spawnl、_spawnlp、_spawnvと _spawnvp の呼び出しでは、新しいプロセスが呼び出しプロセスの環境を継承します。 _spawnle、_spawnlpe、_spawnveと envp の引数でも環境設定のリストを渡すことで、新しいプロセスの環境の変更に _spawnvpe 呼び出しを使用できます。 引数 envp は文字ポインターの配列 (環境変数を定義する null で終わる文字列を指す最終的な要素を除く) 各要素です。 通常、このような文字列の形式は NAME=value であり、NAME は環境変数名、value はその変数に設定する文字列の値です。value は二重引用符で囲みません。envp 配列の最後の要素は NULL にする必要があります。 envp 自体が NULLの場合、起動されたプロセスは、親プロセスの環境設定を継承します。
_spawn 関数は、新しいプロセスで開いているファイルに関するすべての情報が、変換モードを含めて渡すことができます。 この情報は C_FILE_INFO エントリを通じて環境のリアル モードに渡されます。 スタートアップ コードには、このエントリを処理し、環境から削除します。 ただし、_spawn 関数が非 C プロセスを作成するときに、このエントリが環境に残ります。 環境を出力すると、このエントリの定義文字列で環境情報がリアル モードのバイナリ形式で渡されたため表示文字が表示されます。 これは、通常の操作に対する他の効果が生じることはありません。 この保護モードでは、環境情報テキストはフォームに渡され、表示文字は含まれません。
(fflush または _flushallを使用) またはすべてのストリーム _spawn 関数を呼び出す前にを明示的に無効にする必要があります。
_spawn ルーチンの呼び出しによって作成された新しいプロセスはシグナル設定は保持されません。 代わりに、既定の起動されたプロセスのリセット シグナル設定。
出力をリダイレクトする。
DLL または GUI アプリケーションから _spawn を呼び出して、パイプに出力をリダイレクトしたい場合は、2 とおりの方法があります。:
パイプを作成するために Win32 API を使用し、呼び出し AllocConsoleは、Start 構造体と呼び出し CreateProcessのハンドル値を設定します。
パイプを作成する呼び出し、cmd.exe /c Invoke _popen、_wpopen (または command.exe /c) を使用してアプリケーションを。
使用例
// crt_spawn.c
// This program accepts a number in the range
// 1-8 from the command line. Based on the number it receives,
// it executes one of the eight different procedures that
// spawn the process named child. For some of these procedures,
// the CHILD.EXE file must be in the same directory; for
// others, it only has to be in the same path.
//
#include <stdio.h>
#include <process.h>
char *my_env[] =
{
"THIS=environment will be",
"PASSED=to child.exe by the",
"_SPAWNLE=and",
"_SPAWNLPE=and",
"_SPAWNVE=and",
"_SPAWNVPE=functions",
NULL
};
int main( int argc, char *argv[] )
{
char *args[4];
// Set up parameters to be sent:
args[0] = "child";
args[1] = "spawn??";
args[2] = "two";
args[3] = NULL;
if (argc <= 2)
{
printf( "SYNTAX: SPAWN <1-8> <childprogram>\n" );
exit( 1 );
}
switch (argv[1][0]) // Based on first letter of argument
{
case '1':
_spawnl( _P_WAIT, argv[2], argv[2], "_spawnl", "two", NULL );
break;
case '2':
_spawnle( _P_WAIT, argv[2], argv[2], "_spawnle", "two",
NULL, my_env );
break;
case '3':
_spawnlp( _P_WAIT, argv[2], argv[2], "_spawnlp", "two", NULL );
break;
case '4':
_spawnlpe( _P_WAIT, argv[2], argv[2], "_spawnlpe", "two",
NULL, my_env );
break;
case '5':
_spawnv( _P_OVERLAY, argv[2], args );
break;
case '6':
_spawnve( _P_OVERLAY, argv[2], args, my_env );
break;
case '7':
_spawnvp( _P_OVERLAY, argv[2], args );
break;
case '8':
_spawnvpe( _P_OVERLAY, argv[2], args, my_env );
break;
default:
printf( "SYNTAX: SPAWN <1-8> <childprogram>\n" );
exit( 1 );
}
printf( "from SPAWN!\n" );
}