_cwait
Aguarda até outro processo terminar.
Importante
Essa API não pode ser usada em aplicativos executados no Tempo de Execução do Windows.Para obter mais informações, consulte Funções de CRT sem suporte com /ZW.
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; para outros aplicativos: código de ação a realizar no procHandle.
Valor de retorno
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, retorna –1 e define errno da seguinte maneira.
Valor |
Descrição |
---|---|
ECHILD |
Não existe 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, consulte 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 enviado a _cwait deve ser o valor retornado pela chamada para a 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 do termstat indica se o processo especificado terminou normalmente chamando a API Windows ExitProcess. 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 enviado de volta através de termstat, consulte GetExitCodeProcess. Se _cwait for chamado usando um valor NULL para termstat, o código de retorno para o processo especificado não é armazenado.
O parâmetro action é ignorado pelo sistema operacional Windows porque os relacionamentos entre pai e 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. Portanto, nessa situação, não use o identificador retornado.
Requisitos
Rotina |
Cabeçalho necessário |
Cabeçalho opcional |
---|---|---|
_cwait |
<process.h> |
<errno.h> |
Para obter mais informações de 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
{
int nPid;
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].nPid = _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].nPid, _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] );
}
}
Equivalência do .NET Framework
System::Diagnostics::Process::WaitForExit