_cwait
Attend la fin d'un autre processus.
Important
Cette API ne peut pas être utilisée dans les applications qui s’exécutent dans le Windows Runtime. Pour plus d’informations, consultez Fonctions CRT non prises en charge dans les applications de la plateforme Windows universelle.
Syntaxe
intptr_t _cwait(
int *termstat,
intptr_t procHandle,
int action
);
Paramètres
termstat
Pointeur vers une mémoire tampon où le code de résultat du processus spécifié sera stocké, ou NULL
.
procHandle
Handle vers le processus à attendre (autrement dit, le processus qui doit se terminer avant le retour possible de _cwait
).
action
NULL
: ignoré par les applications de système d’exploitation Windows ; pour d’autres applications : code d’action à effectuer sur procHandle
.
Valeur retournée
Quand le processus spécifié s'est correctement terminé, retourne le handle du processus spécifié et affecte à termstat
le code de résultat retourné par le processus spécifié. Sinon, retourne -1 et définit errno
comme suit.
Valeur errno |
Description |
---|---|
ECHILD |
Aucun processus spécifié n’existe, procHandle n’est pas valide ou l’appel à l’API GetExitCodeProcess a WaitForSingleObject échoué. |
EINVAL |
action n'est pas valide. |
Pour plus d’informations sur ces codes de retour et d’autres codes de retour, consultez , , _sys_errlist
_doserrno
et _sys_nerr
.errno
Notes
La fonction _cwait
attend la fin de l'ID du processus spécifié fourni par procHandle
. La valeur de procHandle
celle-ci _cwait
doit être la valeur retournée par l’appel à la _spawn
fonction qui a créé le processus spécifié. Si l'ID de processus se termine avant l'appel à _cwait
, _cwait
est immédiatement retourné. _cwait
peut être utilisé par n'importe quel processus pour attendre tout autre processus connu pour lequel il existe un handle valide (procHandle
).
termstat
pointe vers une mémoire tampon où le code de retour du processus spécifié sera stocké. La valeur de termstat
indique si le processus spécifié s’est terminé normalement en appelant l’API Windows ExitProcess
. ExitProcess
est appelé en interne si le processus spécifié appelle exit
ou _exit
, est retourné à partir de main
ou atteint la fin de main
. Pour plus d’informations sur la valeur transmise, termstat
consultez GetExitCodeProcess
. Si _cwait
elle est appelée à l’aide d’une NULL
valeur pour termstat
, le code de retour du processus spécifié n’est pas stocké.
Le action
paramètre est ignoré par le système d’exploitation Windows, car les relations parent-enfant ne sont pas implémentées dans ces environnements.
Sauf si procHandle
est égal à -1 ou -2 (handles vers le thread ou processus actuel), le handle est fermé. Dans ce cas, n’utilisez pas le handle retourné.
Par défaut, l’état global de cette fonction est limité à l’application. Pour modifier ce comportement, consultez État global dans le CRT.
Spécifications
Routine | En-tête requis | En-tête facultatif |
---|---|---|
_cwait |
<process.h> | <errno.h> |
Pour plus d’informations sur la compatibilité, consultez Compatibility.
Exemple
// 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]);
}
}
L’ordre de la sortie varie d’une exécution à l’autre.
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.
Voir aussi
Processus et contrôle d’environnement
_spawn
, fonctions _wspawn