Linux |
CentOS 4.8 |
|
wait(2) |
wait, waitpid − Attendre la fin d’un processus. |
#include <sys/types.h> pid_t wait (int * status); |
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 si on ne l’a pas encore reçue. |
(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. |
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é. |
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. |
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 (ce qui toutefois n’est pas autorisé par POSIX). Un appel à wait() ou waitpid() bloquera jusqu’à ce qu’un fils se termine, puis échouera avec errno contenant ECHILD. |
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. |
SVr4, POSIX.1 |
clone(2), signal(2), wait4(2), pthread_create(3), signal(7) |
Christophe Blaess, 1997. |
wait(2) |