_spawn_wspawn 関数

_spawn 関数は、新しいプロセスを作成して実行します。

_spawnl, _wspawnl
_spawnle, _wspawnle
_spawnlp, _wspawnlp
_spawnlpe, _wspawnlpe
_spawnv, _wspawnv
_spawnve, _wspawnve
_spawnvp, _wspawnvp
_spawnvpe, _wspawnvpe

関数名の最後の文字は、関数の種類を示します。

レター バリアント
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 で定義されます。

Value 説明
_P_OVERLAY 新しいプロセスで呼び出しプロセスをオーバーレイし、呼び出しプロセスを破棄します (_exec 呼び出しと同じ影響)。
_P_WAIT 新しいプロセスの実行が完了するまで、呼び出しスレッドが中断されます (同期 _spawn)。
_P_NOWAIT または _P_NOWAITO 新しいプロセスと同時に呼び出しプロセスを実行し続けます (非同期 _spawn)。
_P_DETACH 呼び出しプロセスを実行し続けます。新しいプロセスは、コンソールまたはキーボードへのアクセスなしでバックグラウンドで実行されます。 新しいプロセスに対して _cwait を呼び出すと失敗します (非同期 _spawn)。

cmdname 引数は、新しいプロセスとして実行されるファイルを指定し、完全パス (ルートから)、部分パス (現在の作業ディレクトリから)、またはファイル名のみを指定できます。 cmdname にファイル名拡張子がないか、ピリオド (.) で終わらない場合、_spawn 関数では、.com ファイル名拡張子、.exe ファイル名拡張子、.bat ファイル名拡張子、.cmd ファイル名拡張子の順に試します。

cmdname にファイル名拡張子がある場合は、その拡張子だけが使用されます。 cmdname の末尾にピリオドがある場合、_spawn 呼び出しはファイル名拡張子がない cmdname を検索します。 _spawnlp 関数、_spawnlpe 関数、_spawnvp 関数、_spawnvpe 関数は、PATH 環境変数に指定されたディレクトリ内で同じ処理手順を使用して cmdname を検索します。

cmdname にドライブ指定子やスラッシュが含まれている場合、つまり相対パスが指定されている場合、_spawn 呼び出しでは指定のファイルだけを検索し、パスは検索しません。

以前は、成功時にこれらのいくつかの関数が errno を 0 に設定しましたが、現在の動作は、C 標準で指定されているとおり、成功時に errno をそのままにします。 以前の動作をエミュレートする必要がある場合は、これらの関数を呼び出す直前に errno を 0 に設定します。

Note

オーバーレイの初期化と終了が正しく行われるようにするため、オーバーレイ ルーチンを出入りするのに setjmp または longjmp 関数を使用しないでください。

生成されたプロセスの引数

新しいプロセスに引数を渡すには、文字列への 1 つ以上のポインターを _spawn 呼び出しの引数として指定します。 これらの文字列が生成されたプロセスの引数リストとなります。 新しいプロセスの引数リストを形成する文字列を合わせた長さは 1024 バイト以下でなければなりません。 各文字列の終端を表す nulll 文字 ('\0') はカウントされませんが、引数を区切るために自動的に挿入されるスペース文字はカウントされます。

Note

文字列に空白が含まれる場合、予期しない動作になることがあります。たとえば、_spawn"hi there" という文字列に渡すと、新しいプロセスは "hi""there" という 2 つの引数を使用する結果になります。 新しいプロセスでは "hi there" というファイルを開こうとするため、プロセスは失敗します。 この問題を回避するには、"\"hi there\"" のように文字列を引用符で囲みます。

重要

ユーザー入力のコンテンツを明示的にチェックしないまま _spawn に渡さないでください。 _spawn によって CreateProcess が呼び出されます。そのため、パス名が修飾されていない場合、セキュリティ上の脆弱性につながる可能性があります。

_spawnl_spawnle_spawnlp_spawnlpe では引数へのポインターが個別の引数として渡され、_spawnv_spawnve_spawnvp_spawnvpe ではポインターの配列として渡されます。 少なくとも 1 つの引数 (arg0 または argv[0]) を生成されたプロセスに渡す必要があります。 規則上、この引数は、コマンド ラインの場合に入力するはずのプログラムの名前です。 別の値を使用しても、エラーは発生しません。

_spawnl_spawnle_spawnlp_spawnlpe の各呼び出しは、通常、引数の個数が事前にわかっている場合に使用します。 arg0 引数は通常、cmdname へのポインターです。 引数 arg1argn は、新しい引数リストを構成する文字列へのポインターです。 argnの後には、引数リストの末尾を示すために NULL ポインターが必要です。

_spawnv_spawnve_spawnvp_spawnvpe の各呼び出しは、新しいプロセスの引数の数が変化する場合に便利です。 引数へのポインターは、配列 argv として渡されます。引数 argv[0] は通常、リアル モードのパスまたは保護モードのプログラム名へのポインターです。argv[1] から argv[n] は、新しい引数リストを形成する文字列へのポインターです。 引数リストの末尾を示すために、argv[n +1] 引数は NULL ポインターである必要があります。

生成されたプロセスの環境

_spawn 呼び出しを作成するときに開いたファイルは、新しいプロセスでも開いたままです。 _spawnl_spawnlp_spawnv_spawnvp の各呼び出しでは、新しいプロセスが呼び出しプロセスの環境を継承します。 envp 引数を使用して環境設定のリストを渡すことで、_spawnle_spawnlpe_spawnve_spawnvpe の各呼び出しを使用して、新しいプロセスの環境を変更できます。 引数 envp は文字ポインターの配列であり、最後の要素以外の各要素は、環境変数を定義する null で終わる文字列を指します。 通常、このような文字列の形式は NAME=value であり、NAME は環境変数名、value はその変数に設定する文字列の値です。 (二 value 重引用符で囲まれません。配列の最後の envp 要素は次のようになります NULLenvp 自身が NULL である場合、生成されたプロセスは親プロセスの環境設定を継承します。

_spawn 関数は、開いているファイルに関するすべての情報 (変換モードを含む) を新しいプロセスに渡すことができます。 この情報は環境内の C_FILE_INFO エントリを通してリアル モードで渡されます。 通常、スタートアップ コードはこのエントリを処理してから、環境から削除します。 ただし、_spawn 関数によって C 以外のプロセスが生成される場合、このエントリは環境内に残されます。 環境を印刷すると、環境情報がバイナリ形式でリアル モードで渡されているため、このエントリの定義文字列にグラフィック文字が示されます。 これ以外の影響が通常の操作に及ぶことはありません。 保護モードでは、環境情報はテキスト形式で渡されるため、グラフィック文字は含まれません。

_spawn 系関数を呼び出す前に、fflush または _flushall を使用してストリームを明示的にフラッシュするか、ストリームを閉じる必要があります。

_spawn ルーチンの呼び出しによって作成された新しいプロセスでは、シグナル設定が保持されません。 代わりに、生成されたプロセスでは、シグナル設定が既定値にリセットされます。

出力のリダイレクト

_spawn を DLL または GUI アプリケーションから呼び出して、出力をパイプにリダイレクトするには、次の 2 つのオプションがあります。

  • Win32 API を使用してパイプを作成し、呼び出 AllocConsoleし、スタートアップ構造でハンドル値を設定し、呼び出します CreateProcess

  • または_popen_wpopen、パイプを作成し、(またはcommand.exe /c) を使用してcmd.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" );
}
child process output
from SPAWN!

関連項目

プロセスと環境の制御
abort
atexit
_exec_wexec 関数
exit, _Exit, _exit
_flushall
_getmbcp
_onexit, _onexit_m
_setmbcp
system, _wsystem