Sdílet prostřednictvím


_cwait

Čeká na ukončení jiného procesu.

Důležité

Toto rozhraní API nelze použít v aplikacích, které se spouští v prostředí Windows Runtime. Další informace najdete v tématu Funkce CRT, které nejsou v aplikacích Univerzální platforma Windows podporované.

Syntaxe

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

Parametry

termstat
Ukazatel na vyrovnávací paměť, kde bude uložen kód výsledku zadaného procesu, nebo NULL.

procHandle
Popisovač procesu, na který se má čekat (to znamená proces, který se musí před vrácením ukončit _cwait ).

action
NULL: Ignorováno aplikacemi operačního systému Windows; pro jiné aplikace: akční kód, který se má provést procHandle.

Vrácená hodnota

Po úspěšném dokončení zadaného procesu vrátí popisovač zadaného procesu a nastaví termstat se na výsledný kód vrácený zadaným procesem. V opačném případě vrátí hodnotu -1 a nastaví errno se následujícím způsobem.

errno Hodnotu Popis
ECHILD Žádný zadaný proces neexistuje, procHandle je neplatný nebo volání GetExitCodeProcessWaitForSingleObject rozhraní API selhalo.
EINVAL Formát action je neplatný.

Další informace o těchto a dalších návratových kódech naleznete v tématu , , , a_sys_nerr . _sys_errlist_doserrnoerrno

Poznámky

Funkce _cwait čeká na ukončení ID procesu zadaného procesu, který poskytuje procHandle. Předaná _cwait hodnota procHandle by měla být hodnota vrácená voláním _spawn funkce, která vytvořila zadaný proces. Pokud se ID procesu ukončí před _cwait zavolání, _cwait vrátí se okamžitě. _cwait jakýkoli proces může čekat na jakýkoli jiný známý proces, pro který existuje platný popisovač (procHandle).

termstat odkazuje na vyrovnávací paměť, kde bude uložen návratový kód zadaného procesu. Hodnota termstat označuje, jestli se zadaný proces normálně ukončil voláním rozhraní API systému Windows ExitProcess . ExitProcess je volána interně, pokud zadaný proces volá exit nebo _exit, vrátí z main, nebo dosáhne konce main. Další informace o hodnotě, která je předána zpět termstat, naleznete v tématu GetExitCodeProcess. Pokud _cwait je volána pomocí NULL hodnoty pro termstat, návratový kód zadaného procesu není uložen.

Parametr action je ignorován operačním systémem Windows, protože v těchto prostředích nejsou implementovány relace nadřazenosti a podřízenosti.

Pokud procHandle není -1 nebo -2 (úchyty pro aktuální proces nebo vlákno), popisovač bude uzavřen. V takovém případě nepoužívejte vrácený popisovač.

Ve výchozím nastavení je globální stav této funkce vymezen na aplikaci. Chcete-li toto chování změnit, přečtěte si téma Globální stav v CRT.

Požadavky

Rutina Požadovaný hlavičkový soubor Volitelné záhlaví
_cwait <process.h> <errno.h>

Další informace o kompatibilitě najdete v tématu Kompatibilita.

Příklad

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

Pořadí výstupu se liší od spuštění po spuštění.

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.

Viz také

Řízení procesů a prostředí
_spawn, _wspawn funkce