_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.