exit - Terminer normalement un processus
Bibliothèque C standard (
libc,
-lc)
#include <stdlib.h>
[[noreturn]] void exit(int status);
La fonction
exit() termine normalement un processus et l'octet de poids
faible de
statut (c'est-à-dire
statut & 0xFF) est
envoyé au processus parent (consultez
wait(2)).
Toutes les fonctions enregistrées avec
atexit(3) et
on_exit(3) sont appelées dans l'ordre inverse de leur
enregistrement. Il est possible pour une de ces fonctions d'utiliser
atexit(3) ou
on_exit(3) pour enregistrer une fonction
supplémentaire à exécuter lors de la procédure de
terminaison ; le nouvel enregistrement est ajouté au
début de la liste des fonctions qui restent à appeler. Si une de
ces fonctions ne rend pas la main (car elle appelle
_exit(2) ou se tue
avec un signal par exemple), alors aucune des fonctions suivantes de la liste
n'est exécutée et le processus de terminaison est
abandonné (en particulier, le vidage des flux
stdio(3)). Si une
fonction a été enregistrée plusieurs fois avec
atexit(3) ou
on_exit(3), alors elle sera appelée aussi
souvent qu'elle a été enregistrée.
Tous les flux ouverts du type
stdio(3) sont vidés et
fermés. Les fichiers créés par
tmpfile(3) sont
supprimés.
La norme C spécifie deux constantes
EXIT_SUCCESS et
EXIT_FAILURE qui peuvent être passées à
exit() pour indiquer respectivement une terminaison sans ou avec
échec.
La fonction
exit() ne renvoie jamais de valeur.
Pour une explication des termes utilisés dans cette section, consulter
attributes(7).
Interface |
Attribut |
Valeur |
exit() |
Sécurité des threads |
MT-Unsafe race:exit |
La fonction
exit() utilise une variable globale non
protégée et n’est donc pas sûre dans un contexte
multithread.
POSIX.1-2001, POSIX.1-2008, C99, SVr4, 4.3BSD.
Le comportement n'est pas défini si une des fonctions enregistrées
avec
atexit(3) et
on_exit(3) appelle
exit() ou
longjmp(3). Remarquez qu'un appel à
execve(2) supprime
les enregistrements créés en utilisant
atexit(3) et
on_exit(3).
L'utilisation d'
EXIT_SUCCESS et d'
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, le système VMS utilise une convention différente.
BSD a tenté de standardiser les codes de sortie (que certaines
bibliothèques C telles que la bibliothèque C de
GNU ont adoptés), consultez le fichier
<sysexits.h>.
Après
exit(), le statut doit être transmis au processus
parent. Il y a trois cas :
- •
- Si le parent a positionné SA_NOCLDWAIT ou a
positionné SIGCHLD à SIG_IGN, le statut est
abandonné et l'enfant meurt immédiatement.
- •
- Si le parent attendait l'enfant, il est informé du
statut de sortie et l'enfant meurt immédiatement.
- •
- Autrement, l'enfant devient un processus
« zombie » : la plupart des ressources
du processus sont réutilisées mais un emplacement contenant
les informations minimales du processus enfant (statut de terminaison,
statistiques d'utilisation des ressources) est conservé dans la
table de processus. Cela permet au parent d'utiliser par la suite
waitpid(2) (ou similaire) afin de connaître le statut de
terminaison de l'enfant ; après quoi l'emplacement du
processus « zombie » est
libéré.
Si l'implémentation gère le signal
SIGCHLD, celui-ci est
envoyé au processus parent. Si le parent a défini
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 contrôle de la session, alors chaque processus du
groupe de processus en avant-plan de ce terminal reçoit un signal
SIGHUP et le terminal est dissocié de cette session, lui
permettant d'être acquis par un nouveau processus de contrôle.
Si la fin du processus rend orphelin un groupe de processus et si un membre
quelconque de ce groupe de processus nouvellement orphelin est
arrêté, alors tous les processus de ce groupe vont recevoir
SIGHUP suivi de
SIGCONT. Consultez
setpgid(2) pour plus
d'informations sur les processus orphelins.
Mis à part les cas susmentionnés, pour lesquels les processus
ayant reçu un signal peuvent être des enfants du processus
terminé, la terminaison d'un processus
ne cause
pas en
général l'envoi d'un signal aux enfants de ce processus.
Cependant, un processus peut utiliser l'opération
PR_SET_PDEATHSIG de
prctl(2) pour faire en sorte qu'ils
reçoivent un signal si le parent se termine.
_exit(2),
get_robust_list(2),
setpgid(2),
wait(2),
atexit(3),
on_exit(3),
tmpfile(3)
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]>, David Prévot <
[email protected]> et
Grégoire Scano <
[email protected]>
Cette traduction est une documentation libre ; veuillez vous reporter
à la
GNU
General Public License version 3 concernant les conditions de copie
et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
[email protected]