_cwait
Czeka na zakończenie innego procesu.
Ważne
Tego interfejsu API nie można używać w aplikacjach wykonywanych w środowisko wykonawcze systemu Windows. Aby uzyskać więcej informacji, zobacz Funkcje CRT nieobsługiwane w aplikacjach platforma uniwersalna systemu Windows.
Składnia
intptr_t _cwait(
int *termstat,
intptr_t procHandle,
int action
);
Parametry
termstat
Wskaźnik do buforu, w którym będzie przechowywany kod wyniku określonego procesu lub NULL
.
procHandle
Dojście do procesu oczekiwania (oznacza to, że proces, który musi zakończyć się przed _cwait
powrotem).
action
NULL
: ignorowane przez aplikacje systemu operacyjnego Windows; dla innych aplikacji: kod akcji do wykonania w systemie procHandle
.
Wartość zwracana
Po pomyślnym zakończeniu określonego procesu zwraca uchwyt określonego procesu i ustawia termstat
go na kod wynikowy zwracany przez określony proces. W przeciwnym razie zwraca wartość -1 i zestawy errno
w następujący sposób.
errno wartość |
opis |
---|---|
ECHILD |
Nie istnieje określony proces, procHandle jest nieprawidłowy lub wywołanie interfejsu GetExitCodeProcess WaitForSingleObject API nie powiodło się. |
EINVAL |
action jest nieprawidłowy. |
Aby uzyskać więcej informacji na temat tych i innych kodów powrotnych, zobacz errno
, _doserrno
, _sys_errlist
i _sys_nerr
.
Uwagi
Funkcja _cwait
czeka na zakończenie procesu identyfikatora określonego procesu dostarczonego przez procHandle
program . Wartość przekazanego procHandle
_cwait
elementu powinna być wartością zwracaną przez wywołanie _spawn
funkcji, która utworzyła określony proces. Jeśli identyfikator procesu zakończy się przed _cwait
wywołaniem, _cwait
zwraca natychmiast. _cwait
Może służyć dowolny proces do oczekiwania na dowolny inny znany proces, dla którego istnieje prawidłowy uchwyt (procHandle
).
termstat
wskazuje bufor, w którym będzie przechowywany kod powrotny określonego procesu. Wartość parametru termstat
wskazuje, czy określony proces zakończył się normalnie przez wywołanie interfejsu API systemu Windows ExitProcess
. ExitProcess
jest wywoływany wewnętrznie, jeśli określone wywołania exit
procesu lub _exit
, zwraca z main
, lub osiąga koniec main
. Aby uzyskać więcej informacji na temat wartości przekazanej z powrotem przez termstat
program , zobacz GetExitCodeProcess
. Jeśli _cwait
jest wywoływana NULL
przy użyciu wartości dla termstat
, kod zwrotny określonego procesu nie jest przechowywany.
Parametr action
jest ignorowany przez system operacyjny Windows, ponieważ relacje nadrzędny-podrzędny nie są implementowane w tych środowiskach.
Jeśli nie procHandle
ma wartości -1 lub -2 (dojścia do bieżącego procesu lub wątku), dojście zostanie zamknięte. W takiej sytuacji nie używaj zwróconego uchwytu.
Domyślnie stan globalny tej funkcji jest zakresem aplikacji. Aby zmienić to zachowanie, zobacz Stan globalny w CRT.
Wymagania
Procedura | Wymagany nagłówek | Opcjonalny nagłówek |
---|---|---|
_cwait |
<process.h> | <errno.h> |
Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.
Przykład
// 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]);
}
}
Kolejność danych wyjściowych różni się od uruchomienia do uruchomienia.
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.