_cwait
ほかのプロセスが終了するまで待機します。
重要 |
---|
この API は Windows ランタイムで実行されるアプリケーションで使用することはできません。詳細については、でサポート /ZW CRT 関数" "を参照してください。 |
intptr_t _cwait(
int *termstat,
intptr_t procHandle,
int action
);
パラメーター
termstat
指定されたプロセスの結果コードを格納するバッファーへのポインターまたは NULL。procHandle
待機するプロセスへのハンドル (つまり、_cwait が返される前に終了するプロセス。action
null 値: Windows オペレーティング システムのを返します; 他のアプリケーションの場合: procHandleで実行するアクション コード。
戻り値
指定されたプロセスが正常に完了すると、プロセスのハンドルを返し、指定されたプロセスによって返された結果コードに termstat を設定します。正常に完了しなかった場合は、–1 を返し、errno に次の値を設定します。
価値 |
説明 |
---|---|
ECHILD |
指定されたプロセスが存在しないか、procHandle が無効か、GetExitCodeProcess API または WaitForSingleObject API の呼び出しが失敗しました。 |
EINVAL |
action が無効です。 |
これらのプロパティおよびそのほかのリターン コードに関する詳細については、errno、_doserrno、_sys_errlist、および _sys_nerrを参照してください。
解説
procHandleによって指定されたプロセスのプロセス ID が終了するの _cwait 関数のを待ちます。_cwait に渡される procHandle の値は、指定したプロセスを作成した _spawn 関数の呼び出しによって返される値必要があります。プロセス ID が _cwait の呼び出し前に終了した場合、_cwait はすぐに処理を戻します。プロセスで _cwait を使用すると、有効なハンドル (procHandle) を持つ別のプロセスを待機できます。
指定されたプロセスのリターン コードを格納するバッファーへのtermstat のポインター。termstat の値は、指定されたプロセスが ExitProcess API の呼び出しによって正常に終了したかどうかを示します。指定されたプロセスが exit または _exit を呼び出した場合、main から戻った場合、main の終端に達した場合のいずれかで、ExitProcess が内部的に呼び出されます。termstatに渡される値の詳細については、GetExitCodeProcessを参照してください。_cwait が termstatに対して、null 値を使用して呼び出すと、指定したプロセスのリターン コードは格納されません。
Windows オペレーティング システムの環境では、プロセスの親子関係が実装されていないため、action パラメーターは無視されます。
procHandle が -1 または -2 (現在のプロセスまたはスレッドへのハンドル処理します) 場合、ハンドルは閉じられます。したがって、この状況では、返されたハンドルは使用しないでください。
必要条件
ルーチン |
必須ヘッダー |
オプション ヘッダー |
---|---|---|
_cwait |
<process.h> |
<errno.h> |
互換性の詳細については、互換性を参照してください。
使用例
// crt_cwait.c
// compile with: /c
// This program launches several processes and waits
// for a specified process to finish.
//
#define _CRT_RAND_S
#include <windows.h>
#include <process.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
// Macro to get a random integer within a specified range
#define getrandom( min, max ) (( (rand_s (&number), number) % (int)((( max ) + 1 ) - ( min ))) + ( min ))
struct PROCESS
{
int nPid;
char name[40];
} process[4] = { { 0, "Ann" }, { 0, "Beth" }, { 0, "Carl" }, { 0, "Dave" } };
int main( int argc, char *argv[] )
{
int termstat, c;
unsigned int number;
srand( (unsigned)time( NULL ) ); // Seed randomizer
// If no arguments, this is the calling process
if( argc == 1 )
{
// Spawn processes in numeric order
for( c = 0; c < 4; c++ ){
_flushall();
process[c].nPid = _spawnl( _P_NOWAIT, argv[0], argv[0],
process[c].name, NULL );
}
// Wait for randomly specified process, and respond when done
c = getrandom( 0, 3 );
printf( "Come here, %s.\n", process[c].name );
_cwait( &termstat, process[c].nPid, _WAIT_CHILD );
printf( "Thank you, %s.\n", process[c].name );
}
// If there are arguments, this must be a spawned process
else
{
// Delay for a period that's determined by process number
Sleep( (argv[1][0] - 'A' + 1) * 1000L );
printf( "Hi, Dad. It's %s.\n", argv[1] );
}
}
同等の .NET Framework 関数
System::Diagnostics::Process::WaitForExit