_cwait
Wartet, bis ein anderer Prozess beendet wird.
Wichtig
Diese API kann nicht in Anwendungen verwendet werden, die in Windows-Runtime ausgeführt werden. Weitere Informationen finden Sie im Artikel CRT functions not supported in Universal Windows Platform apps (In Apps für die universelle Windows-Plattform nicht unterstützte CRT-Funktionen).
Syntax
intptr_t _cwait(
int *termstat,
intptr_t procHandle,
int action
);
Parameter
termstat
Zeiger auf einen Puffer, in dem der Ergebniscode des angegebenen Prozesses gespeichert wird, oder NULL
.
procHandle
Das Handle für den Prozess, auf den gewartet werden soll (d. h., der Prozess, der beendet werden muss, bevor _cwait
zurückgegeben werden kann).
action
NULL
: Von Windows-Betriebssystemanwendungen ignoriert; für andere Anwendungen: Aktionscode, der ausgeführt werden procHandle
soll.
Rückgabewert
Wenn der angegebene Vorgang erfolgreich abgeschlossen wurde, wird das Handle des angegebenen Prozesses zurückgegeben und termstat
auf den Ergebniscode festgelegt, der vom angegebenen Prozess zurückgegeben wird. Andernfalls wird -1 zurückgegeben und wie folgt festgelegt errno
.
Wert vom Typ errno |
Beschreibung |
---|---|
ECHILD |
Es ist kein angegebener Prozess vorhanden, procHandle ungültig oder der Aufruf der GetExitCodeProcess API WaitForSingleObject ist fehlgeschlagen. |
EINVAL |
action ist ungültig. |
Weitere Informationen zu diesen und anderen Rückgabecodes finden Sie unter , , _doserrno
, _sys_errlist
und _sys_nerr
.errno
Hinweise
Die _cwait
-Funktion wartet auf die Beendigung der Prozess-ID des angegebenen Prozesses, die von procHandle
bereitgestellt wird. Der Wert, procHandle
an _cwait
den übergeben wird, sollte der Wert sein, der vom Aufruf der _spawn
Funktion zurückgegeben wird, die den angegebenen Prozess erstellt hat. Wenn die Prozess-ID vor dem Aufruf von _cwait
beendet wird, wird _cwait
sofort zurückgegeben. _cwait
kann von jedem Prozess verwendet werden, um auf jeden anderen bekannten Prozess zu warten, für den ein gültiges Handle (procHandle
) vorhanden ist.
termstat
weist auf einen Puffer hin, in dem der Rückgabecode des angegebenen Prozesses gespeichert wird. Der Wert gibt termstat
an, ob der angegebene Prozess normal beendet wurde, indem die Windows-API ExitProcess
aufgerufen wird. ExitProcess
wird intern aufgerufen, wenn der angegebene Vorgang exit
oder _exit
aufruft, von main
zurückkehrt oder das Ende von main
erreicht. Weitere Informationen zu dem Wert, der zurückgegeben termstat
wird, finden Sie unter GetExitCodeProcess
. Wenn _cwait
der Rückgabecode des angegebenen Prozesses mit einem NULL
Wert termstat
aufgerufen wird, wird der Rückgabecode des angegebenen Prozesses nicht gespeichert.
Der action
Parameter wird vom Windows-Betriebssystem ignoriert, da beziehungen zwischen übergeordneten und untergeordneten Elementen in diesen Umgebungen nicht implementiert werden.
Sofern procHandle
nicht -1 oder -2 ist (Handles für den aktuellen Prozess oder Thread), wird das Handle geschlossen. Verwenden Sie in diesem Fall nicht das zurückgegebene Handle.
Standardmäßig gilt der globale Zustand dieser Funktion für die Anwendung. Wie Sie dieses Verhalten ändern, erfahren Sie unter Globaler Status in der CRT.
Anforderungen
Routine | Erforderlicher Header | Optionaler Header |
---|---|---|
_cwait |
<process.h> | <errno.h> |
Weitere Informationen zur Kompatibilität finden Sie unter Kompatibilität.
Beispiel
// 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]);
}
}
Die Reihenfolge der Ausgabe variiert von Ausführung zu Ausführung.
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.