_cwait
다른 프로세스가 종료될 때까지 기다립니다.
Important
이 API는 Windows 런타임에서 실행되는 애플리케이션에서 사용할 수 없습니다. 자세한 내용은 유니버설 Windows 플랫폼 앱에서 지원되지 않는 CRT 함수를 참조하세요.
구문
intptr_t _cwait(
int *termstat,
intptr_t procHandle,
int action
);
매개 변수
termstat
지정된 프로세스의 결과 코드가 저장되는 버퍼에 대한 포인터입니다 NULL
.
procHandle
대기 중인 프로세스에 대한 핸들입니다(즉, _cwait
를 반환하기 전에 종료되어야 하는 프로세스).
action
NULL
: Windows 운영 체제 애플리케이션에서 무시됩니다. 다른 애플리케이션의 경우: 수행할 작업 코드입니다 procHandle
.
반환 값
지정된 프로세스가 성공적으로 완료되면 지정된 프로세스의 핸들을 반환하고 termstat
를 지정한 프로세스에서 반환한 결과 코드로 설정합니다. 그렇지 않으면 -1을 반환하고 다음과 같이 설정합니다 errno
.
errno 값 |
설명 |
---|---|
ECHILD |
지정한 프로세스가 없거나, procHandle 유효하지 않거나, API WaitForSingleObject 에 대한 호출이 GetExitCodeProcess 실패했습니다. |
EINVAL |
action 이 잘못되었습니다. |
이러한 코드 및 기타 반환 코드에 대한 자세한 내용은 , _doserrno
및 _sys_nerr
_sys_errlist
를 참조하세요.errno
설명
_cwait
함수는 procHandle
에서 제공하는 지정된 프로세스의 프로세스 ID가 종료될 때까지 기다립니다. 전달되는 _cwait
값 procHandle
은 지정된 프로세스를 만든 함수에 대한 호출 _spawn
에서 반환되는 값이어야 합니다. _cwait
가 호출되기 전에 프로세스 ID가 종료되면 _cwait
가 즉시 반환됩니다. _cwait
는 모든 프로세스에서 유효한 핸들(procHandle
)이 있는 다른 모든 알려진 프로세스를 기다리는 데 사용할 수 있습니다.
termstat
는 지정된 프로세스의 반환 코드가 저장될 버퍼를 가리킵니다. 값 termstat
은 지정된 프로세스가 Windows ExitProcess
API를 호출하여 정상적으로 종료되었는지 여부를 나타냅니다. 지정된 프로세스가 ExitProcess
또는 exit
를 호출하거나, _exit
에서 반환되거나, main
의 끝에 도달한 경우 main
가 내부적으로 호출됩니다. 다시 termstat
전달되는 값에 대한 자세한 내용은 다음을 참조하세요 GetExitCodeProcess
. 값을 termstat
사용하여 NULL
호출되는 경우 _cwait
지정된 프로세스의 반환 코드가 저장되지 않습니다.
action
부모-자식 관계는 이러한 환경에서 구현되지 않으므로 Windows 운영 체제에서 매개 변수를 무시합니다.
procHandle
이 -1 또는 -2(현재 프로세스 또는 스레드에 대한 핸들)가 아닌 경우 핸들이 닫힙니다. 이 경우 반환된 핸들을 사용하지 마세요.
기본적으로 이 함수의 전역 상태는 애플리케이션으로 범위가 지정됩니다. 이 동작을 변경하려면 CRT 전역 상태를 참조하세요.
요구 사항
루틴에서 반환된 값 | 필수 헤더 | 선택적 헤더 |
---|---|---|
_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
{
intptr_t hProcess;
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].hProcess = _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].hProcess, _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]);
}
}
출력 순서는 실행마다 다릅니다.
Hi, Dad. It's Ann.
Come here, Ann.
Thank you, Ann.
Hi, Dad. It's Beth.
Hi, Dad. It's Carl.
Hi, Dad. It's Dave.