Partilhar via


_cwait

Aguarda até outro processo terminar.

Importante

Esta API não pode ser usada em aplicativos executados no Windows Runtime. Para obter mais informações, confira Funções do CRT sem suporte em aplicativos da Plataforma Universal do Windows.

Sintaxe

intptr_t _cwait(
   int *termstat,
   intptr_t procHandle,
   int action
);

Parâmetros

termstat
Ponteiro para um buffer em que o código de resultado do processo especificado será armazenado, ou NULL.

procHandle
O identificador para o processo a esperar (ou seja, o processo que precisa terminar antes de _cwait poder retornar).

action
NULL: ignorado por aplicativos do sistema operacional Windows e para outras aplicações: código de ação a executar em procHandle.

Valor retornado

Quando o processo especificado é concluído com sucesso, retorna o identificador do processo especificado e define termstat para o código de resultado retornado pelo processo especificado. Caso contrário, retornará -1 e definirá errno conforme a seguir.

errno valor Descrição
ECHILD Nenhum processo especificado, procHandle é inválido ou a chamada para a API GetExitCodeProcess ou WaitForSingleObject falhou.
EINVAL action é inválido.

Para obter mais informações sobre esses e outros códigos de retorno, confira errno, _doserrno, _sys_errlist e _sys_nerr.

Comentários

A função _cwait espera o encerramento de ID do processo especificado fornecido por procHandle. O valor de procHandle passado para _cwait deverá ser o valor retornado pela chamada à função _spawn que criou o processo especificado. Se a ID do processo terminar antes de _cwait ser chamada, _cwait retorna imediatamente. _cwait pode ser usado por qualquer processo para esperar qualquer outro processo conhecido para o qual exista um identificador válido (procHandle).

termstat aponta para um buffer em que o código de retorno do processo especificado será armazenado. O valor de termstat indicará se o processo especificado foi encerrado normalmente chamando a API ExitProcess do Windows. ExitProcess é chamado internamente se o processo especificado chamar exit ou _exit, retornar de main ou atingir o fim de main. Para obter mais informações sobre o valor que é passado de volta pelo termstat, consulte GetExitCodeProcess. Se _cwait for chamado usando um valor de NULL para termstat, o código de retorno do processo especificado não será armazenado.

O parâmetro action será ignorado pelo sistema operacional Windows porque os relacionamentos pai-filho não são implementados nesses ambientes.

A menos que procHandle seja -1 ou -2 (identificadores para o processo ou thread atual), o identificador será fechado. Nessa situação, não use o identificador retornado.

Por padrão, o estado global dessa função tem como escopo o aplicativo. Para alterar esse comportamento, confira Estado global no CRT.

Requisitos

Rotina Cabeçalho necessário Cabeçalho opcional
_cwait <processo.h> <errno.h>

Para obter informações sobre compatibilidade, consulte Compatibilidade.

Exemplo

// 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]);
    }
}

A ordem da saída varia de execução para execução.

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.

Confira também

Controle de processo e ambiente
_spawn, _wspawn funções