atexit - Enregistrer une fonction à appeler à la fin d'un
programme
Bibliothèque C standard (
libc,
-lc)
#include <stdlib.h>
int atexit(void (*fonction)(void));
La fonction
atexit() enregistre la
fonction donnée pour que
celle-ci soit automatiquement appelée lorsque le programme se termine
normalement avec
exit(3) ou lors de la fin de la fonction
main()
du programme. Les fonctions ainsi enregistrées sont invoquées
dans l'ordre inverse de leur enregistrement ; aucun argument n'est
transmis.
La même fonction peut être enregistrée plusieurs
fois : elle sera appelée une fois pour chaque enregistrement.
POSIX.1 exige de l'implémentation qu'elle permette d'enregistrer au moins
ATEXIT_MAX (32) de ces fonctions. La limite effective prise en charge
par une implémentation peut être obtenue avec
sysconf(3).
Lorsqu'un processus enfant est créé avec
fork(2), il
hérite d'une copie des enregistrements de son parent. À la suite
d'un appel réussi à l'une des fonctions
exec(3), tous les
enregistrements sont supprimés.
La fonction
atexit() renvoie
0 en cas de succès et une
valeur non nulle en cas d'échec.
Pour une explication des termes utilisés dans cette section, consulter
attributes(7).
Interface |
Attribut |
Valeur |
atexit() |
Sécurité des threads |
MT-Safe |
POSIX.1-2001, POSIX.1-2008, C99, SVr4, 4.3BSD.
Les fonctions enregistrées avec
atexit() (et
on_exit(3)) ne
sont pas appelées si le programme se termine anormalement à
cause de l'envoi d'un signal.
Si l'une des fonctions enregistrées appelle
_exit(2), alors toutes
les autres fonctions restantes ne sont pas appelées, et les autres
étapes de fin de processus effectuées par
exit(3) ne sont
pas réalisées.
POSIX.1 stipule que le résultat de plus d'un appel à
exit(3) (par exemple, appeler
exit(3) dans une fonction
enregistrée avec ) est indéfini. Sur quelques
systèmes (mais pas sous Linux), cela peut produire une boucle
infinie ; les programmes portables ne doivent pas appeler
exit(3) dans une fonction enregistrée avec .
Les fonctions
atexit() et
on_exit(3) enregistrent les fonctions
dans la même liste : les fonctions ainsi enregistrées
sont invoquées dans l'ordre inverse de leur enregistrement par ces deux
fonctions.
POSIX.1-2001 stipule que le résultat est indéfini si
longjmp(3) est utilisée pour terminer l'exécution d'une
fonction enregistrée avec
atexit().
Depuis la version 2.2.3 de la glibc,
atexit() (et
on_exit(3)) peut être utilisée dans une
bibliothèque partagée pour définir les fonctions qui sont
appelées lorsque la bibliothèque partagée est
déchargée.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void
bye(void)
{
printf("That was all, folks\n");
}
int
main(void)
{
long a;
int i;
a = sysconf(_SC_ATEXIT_MAX);
printf("ATEXIT_MAX = %ld\n", a);
i = atexit(bye);
if (i != 0) {
fprintf(stderr, "impossible de définir la fonction de sortie\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
_exit(2),
dlopen(3),
exit(3),
on_exit(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]