Oui, il y a certaines circonstances, telles que :
La fonction exit() doit d'abord appeler toutes les fonctions enregistrées par atexit(), dans l'ordre inverse de leur enregistrement, sauf qu'une fonction est appelée après toute fonction précédemment enregistrée qui avait déjà été appelée au moment de son enregistrement. Chaque fonction est appelée autant de fois qu'elle a été enregistrée. Si, lors de l'appel à une telle fonction, un appel à la fonction longjmp() est effectué qui mettrait fin à l'appel à la fonction enregistrée, le comportement est indéfini.
Si une fonction enregistrée par un appel à atexit() ne revient pas, les fonctions enregistrées restantes ne seront pas appelées et le reste du traitement exit() ne sera pas terminé. Si exit() est appelé plus d'une fois, le comportement n'est pas défini.
Voir la page POSIX à la sortie.
Pour plus d'informations, attachez un débogueur lorsque vous atteignez la situation et jetez un œil à la pile des appels.
Appelez-vous exit()
du gestionnaire de signal ?
En man 7 signal
, section Fonctions de sécurité du signal asynchrone vous pouvez voir toutes les fonctions dont le fonctionnement est garanti lorsqu'elles sont appelées depuis un gestionnaire de signal :
Une fonction de traitement de signal doit être très prudente, car le traitement ailleurs peut être interrompu à un moment arbitraire de l'exécution du programme. POSIX a le concept de "fonction sûre". Si un signal interrompt l'exécution d'une fonction non sécurisée et que le gestionnaire appelle une fonction non sécurisée, alors le comportement du programme est indéfini.
POSIX.1-2004 (également connu sous le nom de POSIX.1-2001 Technical Corrigendum 2) nécessite une implémentation pour garantir que les fonctions suivantes peuvent être appelées en toute sécurité à l'intérieur d'un gestionnaire de signaux :
Vous pouvez y voir les fonctions _Exit()
, _exit()
et abort()
, mais surtout pas exit()
. Vous ne devez donc pas l'appeler à partir d'un gestionnaire de signal.
Le pire, c'est que même si vous appelez une fonction non sécurisée à partir d'un gestionnaire de signal (printf()
n'importe lequel ?), cela fonctionnera la plupart du temps... mais pas toujours.