_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.
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по