Compartir a través de


_cwait

Espera hasta que finaliza otro proceso.

Importante

Esta API no se puede usar en aplicaciones que se ejecutan en Windows en tiempo de ejecución. Para obtener más información, vea Funciones de CRT no admitidas en aplicaciones de la Plataforma universal de Windows.

Sintaxis

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

Parámetros

termstat
Puntero a un búfer en el que se almacenará el código de resultado del proceso especificado, o NULL.

procHandle
Identificador del proceso al que se va a esperar (es decir, el proceso que tiene que finalizar antes de que _cwait pueda devolver un valor).

action
procHandle: las aplicaciones el sistema operativo Windows lo omiten; en el caso de otras aplicaciones: código de acción que se va a realizar en NULL.

Valor devuelto

Cuando el proceso especificado finaliza correctamente, devuelve el identificador del proceso especificado y establece termstat en el código de resultado devuelto por el proceso especificado. De lo contrario, devuelve –1 y establece errno como se indica a continuación.

Valor de errno Descripción
ECHILD No existe ningún proceso especificado, procHandle no es válido o la llamada a la API GetExitCodeProcess o WaitForSingleObject ha generado errores.
EINVAL action no es válido.

Para obtener más información sobre estos y otros códigos de retorno, vea errno, _doserrno, _sys_errlist y _sys_nerr.

Comentarios

La función _cwait espera a que finalice el proceso de identificación de proceso proporcionado por procHandle para el proceso especificado. El valor de procHandle que se pasa a _cwait debe ser el valor devuelto por la llamada a la función _spawn que ha creado el proceso especificado. Si el identificador de proceso finaliza antes de que se llame a _cwait, _cwait devuelve un valor inmediatamente. _cwait se puede usar en cualquier proceso para esperar a cualquier otro proceso conocido para el que existe un identificador válido (procHandle).

termstat señala a un búfer en el que se almacenará el código devuelto del proceso especificado. El valor de termstat indica si el proceso especificado ha finalizado con normalidad mediante una llamada a la API ExitProcess de Windows. Se llama internamente a ExitProcess si el proceso especificado llama a exit o _exit, vuelve desde main o llega al final de main. Para obtener más información sobre el valor que se pasa a través termstatde , vea GetExitCodeProcess. Si se llama a _cwait con un valor NULL para termstat, el código de retorno del proceso especificado no se almacena.

El sistema operativo Windows omite el parámetro action, porque en estos entornos no están implementadas las relaciones principal-secundario.

A menos que procHandle sea -1 o -2 (identificadores del proceso o subproceso actual), el identificador se cierra. En esta situación, no use el identificador devuelto.

De manera predeterminada, el estado global de esta función está limitado a la aplicación. Para cambiar este comportamiento, consulte Estado global en CRT.

Requisitos

Routine Encabezado necesario Encabezado opcional
_cwait <process.h> <errno.h>

Para obtener más información sobre compatibilidad, consulte Compatibilidad.

Ejemplo

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

El orden de la salida varía de una ejecución a otra.

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.

Consulte también

Control de procesos y entornos
Funciones _spawn, _wspawn