Поделиться через


_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 недействителен или вызов к WaitForSingleObjectGetExitCodeProcess 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.

См. также

Управление процессами и средой
_spawn, _wspawn функции