_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 procHandlesoll.

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_errlistund _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 termstatwird, finden Sie unter GetExitCodeProcess. Wenn _cwait der Rückgabecode des angegebenen Prozesses mit einem NULL Wert termstataufgerufen 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.

Siehe auch

Prozess- und Umgebungskontrolle
_spawn, _wspawn Funktionen