Y a-t-il une différence entre les fonctions on_exit() et atexit() ?

StackOverflow https://stackoverflow.com/questions/10680

  •  08-06-2019
  •  | 
  •  

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 ?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top