En C et C ++, quelle est la différence entre exit()
et abort()
? J'essaye de terminer mon programme après une erreur (pas une exception).
En C et C ++, quelle est la différence entre exit()
et abort()
? J'essaye de terminer mon programme après une erreur (pas une exception).
Réponses:
abort()
quitte votre programme sans appeler les fonctions enregistrées en utilisant d' atexit()
abord, et sans appeler d'abord les destructeurs d'objets. exit()
fait les deux avant de quitter votre programme. Cependant, il n'appelle pas de destructeurs pour les objets automatiques. Alors
A a;
void test() {
static A b;
A c;
exit(0);
}
Détruira a
et b
correctement, mais n'appellera pas les destructeurs de c
. abort()
n'appellerait pas les destructeurs de l'un ou l'autre des objets. Comme cela est malheureux, la norme C ++ décrit un mécanisme alternatif qui garantit une terminaison correcte:
Les objets avec une durée de stockage automatique sont tous détruits dans un programme dont la fonction
main()
ne contient aucun objet automatique et exécute l'appel àexit()
. Le contrôle peut être transféré directement à un telmain()
en lançant une exception interceptéemain()
.
struct exit_exception {
int c;
exit_exception(int c):c(c) { }
};
int main() {
try {
// put all code in here
} catch(exit_exception& e) {
exit(e.c);
}
}
Au lieu d'appeler exit()
, organisez ce code à la throw exit_exception(exit_code);
place.
abort envoie un signal SIGABRT, exit ferme simplement l'application effectuant un nettoyage normal.
Vous pouvez gérer un signal d' abandon comme vous le souhaitez, mais le comportement par défaut consiste également à fermer l'application avec un code d'erreur.
abort n'effectuera pas la destruction d'objets de vos membres statiques et globaux, mais exit le fera.
Bien sûr, lorsque l'application est complètement fermée, le système d'exploitation libère toute mémoire non libérée et d'autres ressources.
À la fois lors de l'arrêt du programme d' abandon et de sortie (en supposant que vous n'ayez pas remplacé le comportement par défaut), le code de retour sera renvoyé au processus parent qui a démarré votre application.
Consultez l'exemple suivant:
SomeClassType someobject;
void myProgramIsTerminating1(void)
{
cout<<"exit function 1"<<endl;
}
void myProgramIsTerminating2(void)
{
cout<<"exit function 2"<<endl;
}
int main(int argc, char**argv)
{
atexit (myProgramIsTerminating1);
atexit (myProgramIsTerminating2);
//abort();
return 0;
}
Commentaires:
Si abort est décommentée: rien est imprimé et le destructeur de SomeObject ne sera pas appelé.
Si abandonner est commenté comme ci-dessus: un destructeur d'objet sera appelé, vous obtiendrez la sortie suivante:
sortie fonction 2
sortie fonction 1
Les choses suivantes se produisent lorsqu'un programme appelle exit
():
atexit
fonction sont exécutéestmpfile
sont supprimésLa abort
fonction () envoie le SIGABRT
signal au processus en cours, s'il n'est pas intercepté, le programme se termine sans aucune garantie que les flux ouverts sont vidés / fermés ou que les fichiers temporaires créés via tmpfile
sont supprimés, atexit
les fonctions enregistrées ne sont pas appelées et un non- l'état de sortie zéro est renvoyé à l'hôte.
Depuis la page de manuel exit ():
La fonction exit () provoque l'arrêt normal du processus et la valeur de status & 0377 est renvoyée au parent.
Depuis la page de manuel abort ():
L'abort () débloque d'abord le signal SIGABRT, puis lève ce signal pour le processus appelant. Cela entraîne l'arrêt anormal du processus à moins que le signal SIGABRT ne soit capturé et que le gestionnaire de signaux ne retourne pas.
abort
envoie le SIGABRT
signal. abort
ne revient pas à l'appelant. Le gestionnaire par défaut du SIGABRT
signal ferme l'application. stdio
les flux de fichiers sont vidés, puis fermés. Cependant, les destructeurs pour les instances de classe C ++ ne le sont pas (pas sûr sur celui-ci - peut-être que les résultats ne sont pas définis?).
exit
a ses propres rappels, définis avec atexit
. Si des callbacks sont spécifiés (ou un seul), ils sont appelés dans l'ordre inverse de leur ordre d'enregistrement (comme une pile), puis le programme se termine. Comme avec abort
, exit
ne revient pas à l'appelant. stdio
les flux de fichiers sont vidés, puis fermés. En outre, les destructeurs pour les instances de classe C ++ sont appelés.