_cwait
다른 프로세스가 종료될 때까지 기다립니다.
중요
이 API는 Windows 런타임에서 실행되는 응용 프로그램에서 사용할 수 없습니다.자세한 내용은 CRT 함수는 /ZW 옵션을 지원하지 않음을 참조하세요.
intptr_t _cwait( int *termstat, intptr_t procHandle, int action );
매개 변수
termstat
지정된 프로세스의 결과 코드가 저장되는 버퍼에 대한 포인터이거나 NULL입니다.procHandle
대기 중인 프로세스에 대한 핸들입니다(즉, _cwait를 반환하기 전에 종료되어야 하는 프로세스).action
NULL: Windows 운영 체제 응용 프로그램에서 무시합니다. 다른 응용 프로그램의 경우: procHandle에 대해 수행할 작업 코드입니다.
반환 값
지정된 프로세스가 성공적으로 완료되면 지정된 프로세스의 핸들을 반환하고 termstat를 지정한 프로세스에서 반환한 결과 코드로 설정합니다. 그렇지 않으면 –1을 반환하고 다음과 같이 errno를 설정합니다.
값 |
설명 |
---|---|
ECHILD |
지정된 프로세스가 없거나, procHandle이 잘못되었거나, GetExitCodeProcess 또는 WaitForSingleObject API에 대한 호출에 실패했습니다. |
EINVAL |
action이 잘못되었습니다. |
이러한 반환 코드 및 기타 반환 코드에 대한 자세한 내용은 errno, _doserrno, _sys_errlist 및 _sys_nerr을 참조하십시오.
설명
_cwait 함수는 procHandle에서 제공하는 지정된 프로세스의 프로세스 ID가 종료될 때까지 기다립니다. _cwait에 전달된 procHandle의 값은 지정된 프로세스를 만든 _spawn 함수에 대한 호출에서 반환한 값과 같아야 합니다. _cwait가 호출되기 전에 프로세스 ID가 종료되면 _cwait가 즉시 반환됩니다. _cwait는 모든 프로세스에서 유효한 핸들(procHandle)이 있는 다른 모든 알려진 프로세스를 기다리는 데 사용할 수 있습니다.
termstat는 지정된 프로세스의 반환 코드가 저장될 버퍼를 가리킵니다. termstat의 값은 지정된 프로세스가 Windows ExitProcess API를 호출하여 정상적으로 종료되었는지 여부를 나타냅니다. 지정된 프로세스가 exit 또는 _exit를 호출하거나, main에서 반환되거나, main의 끝에 도달한 경우 ExitProcess가 내부적으로 호출됩니다. termstat를 통해 다시 전달되는 값에 대한 자세한 내용은 GetExitCodeProcess를 참조하세요. termstat의 NULL 값을 사용하여 _cwait를 호출하면 지정된 프로세스의 반환 코드가 저장되지 않습니다.
이러한 환경에서는 부모-자식 관계가 구현되지 않으므로 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