exit - Fin normale d'un programme.
La fonction
exit() termine normalement le programme en cours.
La valeur
status & 0377 est renvoyée au processus parent.
(voir
wait(2)).
Toutes les fonctions enregistrées avec
atexit(3) et
on_exit()
sont invoquées dans l'ordre inverse de l'enregistrement, les flux ouverts
sont vidés et fermés.
Les fichiers créés par
tmpfile(2) sont supprimés.
Le standard C mentionne deux constantes symboliques
EXIT_SUCCESS et
EXIT_FAILURE qui peuvent être passée à
exit() pour indiquer
respectivement une terminaison en succès ou en échec.
Durant le traitement de exit, il est possible d'enregistrer des
fonctions supplémentaires avec
atexit() et
on_exit().
C'est toujours la dernière fonction enregistrée qui est extraite de
leur liste et invoquée.
Le comportement est indéfini si durant ce traitement, on invoque
exit() ou
longjmp().
L'utilisation d'EXIT_SUCCESS et EXIT_FAILURE est légèrement plus portable
(vers des environnements non-Unix) que celle de zéro et d'une valeur non-nulle
comme 1 ou -1. En particulier, VMS utilise une convention différente.
BSD a tenté de standardiser les codes de sortie, voir le fichier
<sysexits.h>.
Après un
exit(), le code de retour doit être transmis au processus
parent. Il y a trois cas. Si le parent a mentionné SA_NOCLDWAIT ou s'il
a positionné le comportement de SIGCHLD à SIG_IGN, le status est ignoré.
Si le père était en attente de la fin de son fils, il reçoit le status
de retour. Dans ces deux cas, le fils meurt immédiatement.
Si le parent n'est pas en attente, mais n'a pas indiqué qu'il
désire ignorer le code de retour, le processus fils devient un "zombie".
Ce n'est rien d'autre qu'une coquille enveloppant le code de retour,
que le processus père pourra consulter ultérieurement grâce à l'une des
fonctions de la famille
wait().
Si l'implémentation supporte le signal SIGCHLD, celui-ci est envoyé au
processus père. Si le père a mentionné SA_NOCLDWAIT, il n'est pas précisé
si SIGCHLD est envoyé ou non.
Si le processus est un leader de session, et si son terminal de contrôle est
le terminal de la session, alors chaque processus du groupe de processus en
avant-plan su ce terminal reçoit un signal SIGHUP, et le terminal est
dissocié de la session, lui permettant d'être réacquis par un nouveau processus
de contrôle.
Si la fin du processus rend orphelin un groupe de processus, et si certain
membres de ce groupe sont arrêtés, alors tous les processus du groupe vont recevoir
SIGHUP suivi de SIGCONT.
Christophe Blaess, 1996-2003.