Y a-t-il une différence entre les fonctions on_exit() et atexit() ?
Question
Y a-t-il une différence entre
int on_exit(void (*function)(int , void *), void *arg);
et
int atexit(void (*function)(void));
à part le fait que la fonction utilisée par on_exit obtient le statut de sortie ?
Autrement dit, si je ne me soucie pas du statut de sortie, y a-t-il une raison d'utiliser l'un ou l'autre ?
Modifier: De nombreuses réponses mettent en garde contre on_exit
parce que ce n'est pas standard.Si je développe une application destinée à un usage interne en entreprise et dont le fonctionnement est garanti sur des configurations spécifiques, dois-je m'en inquiéter ?
La solution
Selon ce lien J'ai trouvé qu'il semble y avoir quelques différences. on_exit
vous permettra de transmettre un argument qui est transmis au on_exit
fonction lorsqu'il est appelé...ce qui pourrait vous permettre de configurer des pointeurs pour effectuer un travail de nettoyage lorsqu'il est temps de quitter.
Par ailleurs, il apparaît que on_exit
était une fonction spécifique à SunOS qui pouvait ne pas être compatible sur toutes les plateformes...vous voudrez peut-être vous en tenir à atexit, même s'il est plus restrictif.
Autres conseils
Tu devrais utiliser atexit()
si possible. on_exit()
est non standard et moins courant.Par exemple, il n'est pas disponible sur OS X.
Kernel.org - on_exit()
:
Cette fonction provient de Sunos 4, mais est également présente dans LIBC4, LIBC5 et GLIBC.Cela ne se produit plus sous Solaris (SunOS 5).Évitez cette fonction et utilisez à la place l'ATexit standard (3).
La différence est que atexit
est C et on_exit
est une extension étrange disponible sur GNU et qui sait quoi sur d'autres systèmes Unixy (mais PAS partie de POSIX).
@Nathan, je ne trouve aucune fonction qui renverra le code de sortie du processus en cours d'exécution.Je suppose que ce n'est pas encore réglé au moment où atexit()
est appelé, de toute façon.Je veux dire par là que le moteur d'exécution sait de quoi il s'agit, mais ne l'a probablement pas signalé au système d'exploitation.Mais ce n’est qu’une conjecture.
Il semble que vous devrez soit utiliser on_exit()
ou structurez votre programme de manière à ce que le code de sortie n'ait pas d'importance.Il ne serait pas déraisonnable que la dernière instruction de votre fonction principale retourne une valeur globale exited_cleanly
variable à vrai.Dans la fonction avec laquelle vous vous inscrivez atexit()
, vous pouvez vérifier cette variable pour déterminer comment le programme s'est terminé.Cela ne vous donnera que deux états, mais je pense que cela suffira pour la plupart des besoins.Vous pouvez également étendre ce type de schéma pour prendre en charge davantage d’états de sortie si nécessaire.
@Nathan
Tout d’abord, voyez s’il existe un autre appel API pour déterminer l’état de sortie…un rapide coup d'œil et je n'en vois pas, mais je ne connais pas bien l'API C standard.
Une alternative simple consiste à disposer d'une variable globale qui stocke l'état de sortie...la valeur par défaut étant une cause d'erreur inconnue (si le programme se termine anormalement).Ensuite, lorsque vous appelez exit, vous pouvez stocker l'état de sortie dans le global et le récupérer à partir de n'importe quelle fonction atexit.Cela nécessite de stocker le statut de sortie avec diligence avant chaque appel de sortie, ce qui n'est clairement pas idéal, mais s'il n'y a pas d'API et que vous ne voulez pas risquer on_exit
je ne suis pas sur le quai...c'est peut-être la seule option.