WAIT
Section: Manuel du programmeur Linux (2) Updated: 18 juillet 2003 Index
NOM
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
NOTES
SPÉCIFICITÉS LINUX
CONFORMITÉ
VOIR AUSSI
TRADUCTION
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.
|