_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 hodnota |
Popis |
---|---|
ECHILD |
Žádný zadaný proces neexistuje, procHandle je neplatný nebo volání GetExitCodeProcess WaitForSingleObject 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
_doserrno
errno
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.