Condividi tramite


_cwait

Attende la conclusione di un altro processo.

Importante

Non è possibile usare questa API nelle applicazioni eseguite in Windows Runtime. Per altre informazioni, vedere Funzioni CRT non supportate nelle app della piattaforma UWP (Universal Windows Platform).

Sintassi

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

Parametri

termstat
Puntatore a un buffer in cui verrà archiviato il codice del risultato del processo specificato o NULL.

procHandle
Handle del processo da attendere, ovvero il processo che deve terminare prima che _cwait possa restituire un risultato.

action
NULL: ignorato dalle applicazioni del sistema operativo Windows; per altre applicazioni: codice azione da eseguire su procHandle.

Valore restituito

Al termine del processo specificato, restituisce l'handle di quest'ultimo e imposta termstat sul codice risultato che viene restituito dal processo specificato. In caso contrario, restituisce -1 e imposta come indicato di errno seguito.

Valore errno Descrizione
ECHILD Non esiste alcun processo specificato, procHandle non è valido o la chiamata all'API GetExitCodeProcess o WaitForSingleObject non è riuscita.
EINVAL action non è valido.

Per altre informazioni su questi e altri codici restituiti, vedere errno, _doserrno, _sys_errliste _sys_nerr.

Osservazioni:

La funzione _cwait attende il termine dell'ID processo del processo specificato fornito da procHandle. Il valore di procHandle passato a _cwait deve essere il valore restituito dalla chiamata alla _spawn funzione che ha creato il processo specificato. Se l'ID processo termina prima della chiamata a _cwait, viene restituito immediatamente il risultato di _cwait. _cwait può essere usato da qualsiasi processo per l'attesa di qualsiasi altro processo noto per cui esiste un handle valido (procHandle).

termstat punta a un buffer in cui verrà archiviato il codice restituito del processo specificato. Il valore di termstat indica se il processo specificato è terminato normalmente chiamando l'API di Windows ExitProcess . ExitProcess viene chiamato internamente se il processo specificato chiama exit oppure _exit, restituisce un risultato da main o raggiunge la fine di main. Per altre informazioni sul valore passato tramite termstat, vedere GetExitCodeProcess. Se _cwait viene chiamato usando un NULL valore per termstat, il codice restituito del processo specificato non viene archiviato.

Il action parametro viene ignorato dal sistema operativo Windows perché le relazioni padre-figlio non vengono implementate in questi ambienti.

A meno che procHandle non sia -1 o -2 (handle al processo o thread corrente), l'handle verrà chiuso. In questo caso, non usare l'handle restituito.

Per impostazione predefinita, lo stato globale di questa funzione è limitato all'applicazione. Per modificare questo comportamento, vedere Stato globale in CRT.

Requisiti

Ciclo Intestazione obbligatoria Intestazione facoltativa
_cwait <process.h> <errno.h>

Per altre informazioni sulla compatibilità, vedere Compatibility (Compatibilità).

Esempio

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

L'ordine dell'output varia da esecuzione a esecuzione.

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.

Vedi anche

Processo e controllo dell'ambiente
_spawn, _wspawn funzioni