man wait (Appels systèmes) - Attendre la fin d'un processus.

NOM

wait, waitpid - Attendre la fin d'un processus.

SYNOPSIS

#include <sys/types.h>

#include <sys/wait.h> pid_t wait (int * status);

pid_t waitpid (pid_t pid, int * status, int options);

DESCRIPTION

La fonction wait suspend l'exécution du processus courant jusqu'à ce qu'un enfant se termine, ou jusqu'à ce qu'un signal à intercepter arrive. Si un processus fils s'est déjà terminé au moment de l'appel (il est devenu "zombie"), la fonction revient immédiatement. Toutes les ressources utilisées par le fils sont libérées.

La fonction waitpid suspend l'exécution du processus courant jusqu'à ce que le processus fils numéro pid se termine, ou jusqu'à ce qu'un signal à intercepter arrive. Si le fils mentionné par pid s'est déjà terminé au moment de l'appel (il est devenu "zombie"), la fonction revient immédiatement. Toutes les ressources utilisées par le fils sont libérées.

La valeur de pid peut également être l'une des suivantes :

< -1
attendre la fin de n'importe quel processus fils appartenant à un groupe de processus d'ID pid.
-1
attendre la fin de n'importe quel fils. C'est le même comportement que wait.
0
attendre la fin de n'importe quel processus fils du même groupe que l'appelant.
> 0
attendre la fin du processus numéro pid.

La valeur de l'argument option options est un OU binaire entre les constantes suivantes :

WNOHANG
ne pas bloquer si aucun fils ne s'est terminé.
WUNTRACED
recevoir l'information concernant également les fils bloqués (mais non suivis par trace(2)) si on ne l'a pas encore reçue. L'état des fils suivis est fourni même sans cette option

(Pour les options spécifiques à Linux, voir plus bas).

Si status est non NULL, wait et waitpid y stockent l'information sur la terminaison du fils.

Cette information peut être analysée avec les macros suivantes, qui réclament en argument le buffer status (un int, et non pas un pointeur sur ce buffer).

WIFEXITED(status)
non nul si le fils s'est terminé normalement
WEXITSTATUS(status)
donne le code de retour tel qu'il a été mentionné dans l'appel exit() ou dans le return de la routine main. Cette macro ne peut être évaluée que si WIFEXITED est non nul.
WIFSIGNALED(status)
indique que le fils s'est terminé à cause d'un signal non intercepté.
WTERMSIG(status)
donne le numéro du signal qui a causé la fin du fils. Cette macro ne peut être évaluée que si WIFSIGNALED est non nul.
WIFSTOPPED(status)
indique que le fils est actuellement arrêté. Cette macro n'a de sens que si l'on a effectué l'appel avec l'option WUNTRACED.
WSTOPSIG(status)
donne le numéro du signal qui a causé l'arrêt du fils. Cette macro ne peut être évaluée que si WIFSTOPPED est non nul.

Certaines versions d'Unix (Linux, Solaris, mais pas AIX ou SunOS) définissent aussi une macro WCOREDUMP(status) Pour vérifier si le processus fils a créé un fichier core. N'utilisez ceci qu'encadré par #ifdef WCOREDUMP ... #endif.

VALEUR RENVOYÉE

En cas de réussite, le PID du fils qui s'est terminé est renvoyé, en cas d'échec -1 est renvoyé et errno contient le code d'erreur. Si WNOHANG a été employé et qu'aucun fils ne s'est terminé, zéro est renvoyé.

ERREURS

ECHILD
Le processus indiqué par pid n'existe pas, ou n'est pas un fils du processus appelant. (Ceci peut arriver pour son propre fils si l'action de SIGCHLD est placé sur SIG_IGN, voir également le passage de la section NOTES concernant les threads).
EINVAL
L'argument options est invalide.
EINTR
WNOHANG n'est pas indiqué, et un signal à intercepter ou SIGCHLD a été reçu.

NOTES

Les spécifications Single Unix décrivent un attribut SA_NOCLDWAIT (non supportés sous Linux) permettant (lorsqu'il est positionné) aux processus fils se terminant de ne pas devenir zombies, comme quand l'action pour SIGCHLD est fixée à SIG_IGN. Un appel à wait() ou waitpid() bloquera jusqu'à ce qu'un fils se termine, puis échouera avec errno contenant ECHILD.

Le standard POSIX original laissait le comportement avec SIGCHLD à SIG_IGN non spécifié. Les standards ultérieurs, y compris SUSv2 et POSIX 1003.1-2001 spécifent que le comportement décrit ci-dessus est une option XSI. Linux ne se conforme pas au second des deux points décrits : Si un appel wait() ou waitpid() est fait alors que SIGCHLD est ignoré, alors l'appel se comportera comme si SIGCHLD n'était pas ignoré, c'est à dire qu'il bloquera jusqu'à la première fin d'un fils et renverra le PID et l'état du fils.

SPÉCIFICITÉS LINUX

Dans le noyau Linux, un thread ordonnancé par le noyau n'est pas différent d'un simple processus. En fait, un thread est juste un processus qui est créé à l'aide de la routine - spécifique Linux - clone(2). Les routines portables, comme pthread_create(3) sont implémentées en appelant clone(2). Avant Linux 2.4, un thread était simplement un cas particulier de processus, et en conséquence un thread ne pouvait pas attendre les enfants d'un autre thread, même si ce dernier appartenait au même groupe de threads. Toutefois, POSIX réclame une telle fonctionnalité, et depuis Linux 2.4 un thread peut, par défaut, attendre les enfants des autres threads du même groupe.

Les options suivantes sont spécifiques à Linux, et servent pour les enfants créés avec clone(2).

__WCLONE
Attendre uniquement des enfants clones. Sinon, attendre uniquement les enfants non-clones (un enfant "clone" est un enfant qui n'envoie pas de signal, ou un autre signal que SIGCHLD à son père à sa terminaison). Cette option est ignorée si __WALL est aussi indiqué.
__WALL
(Depuis Linux 2.4) Attendre tous les enfants, quelques soient leurs types (clone ou non-clone).
__WNOTHREAD
(Depuis Linux 2.4) Ne pas attendre les enfants des autres threads du même groupe de threads. Ceci était le cas par défaut avant Linux 2.4.

CONFORMITÉ

SVr4, POSIX.1

VOIR AUSSI

TRADUCTION

Christophe Blaess, 1996-2003.

CETTE PAGE DOCUMENTE AUSSI :