_cwait
Ожидает завершения другого процесса.
Внимание
Этот API нельзя использовать в приложениях, выполняемых в среде выполнения Windows. Дополнительные сведения: Функции CRT, которые не поддерживаются в приложениях универсальной платформы Windows.
Синтаксис
intptr_t _cwait(
int *termstat,
intptr_t procHandle,
int action
);
Параметры
termstat
Указатель на буфер, в котором будет храниться результирующий код указанного процесса или NULL
.
procHandle
Дескриптор для ожидаемого процесса (то есть процесса, который должен завершиться, прежде чем функция _cwait
сможет вернуть значение).
action
NULL
: игнорируется приложениями операционной системы Windows; для других приложений: код действия для выполнения procHandle
.
Возвращаемое значение
Если указанный процесс успешно выполнен, возвращает дескриптор указанного процесса и задает для параметра termstat
код результата, возвращенный указанным процессом. В противном случае возвращает значение -1 и задает следующие значения errno
.
Значение errno |
Description |
---|---|
ECHILD |
Указанный процесс не существует, procHandle недействителен или вызов к WaitForSingleObject GetExitCodeProcess API не выполнен. |
EINVAL |
action недопустим. |
Дополнительные сведения об этих и других кодах возврата см. в разделе errno
, _doserrno
и _sys_nerr
_sys_errlist
.
Замечания
Функция _cwait
ожидает завершения ИД процесса указанного процесса, предоставленного параметром procHandle
. Значение переданного _cwait
значения должно быть значениемprocHandle
, возвращаемым вызовом _spawn
функции, которая создала указанный процесс. Если ИД процесса завершается до вызова _cwait
, _cwait
возвращает значение немедленно. _cwait
может использоваться любым процессом для ожидания другого известного процесса, для которого существует действительный дескриптор (procHandle
).
termstat
указывает на буфер, в который будет сохранен код результата указанного процесса. Значение termstat
указывает, завершается ли указанный процесс обычно путем вызова API Windows ExitProcess
. ExitProcess
вызывается внутренне, если указанный процесс вызывает exit
или _exit
, возвращает значение из main
или достигает конца main
. Дополнительные сведения о значении, передаваемом обратно через termstat
, см. в разделе GetExitCodeProcess
. Если _cwait
вызывается с помощью NULL
значения для termstat
, возвращаемый код указанного процесса не сохраняется.
Параметр 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.