Existe-t-il un moyen d'exécuter du code à la fin, quel que soit le type de terminaison (anormal, normal, non intercepté, etc.)? Je sais que c'est réellement possible en Java, mais est-ce même possible en C++? Im supposant un environnement Windows.Shutdown Hook C++
Répondre
Non - si quelqu'un invoque TerminateProcess
, votre processus sera détruit sans plus tarder, et (en particulier) sans aucune chance de courir plus code dans la processus de fermeture.
Ceci est la bonne réponse; Cependant, comme indiqué par certaines des autres réponses, vous pouvez configurer un exit-handler en utilisant 'atexit()' et vous pouvez attraper la plupart des signaux en utilisant 'signal()' - cependant vous ne pouvez jamais prendre d'action si quelqu'un force la terminaison serait kill-9 sur Linux, et le signal 9 est uncatchable) – Soren
Merci, en fait j'avais peur de cette réponse – Paranaix
aussi: assert(), abort(), terminate() –
Pour applciation de fermeture normale, je suggère
atexit()
Une bonne façon d'aborder le problème utilise l'idiome RAII C++, ce qui signifie ici que les opérations de nettoyage peuvent être placés dans le destructor d'un objet, à savoir
class ShutdownHook {
~ShutdownHook() {
// exit handler code
}
};
int main() {
ShutdownHook h;
//...
}
Voir la Object Lifetime Manager dans la bibliothèque ACE. Au document lié, ils discutent aussi de la fonction atexit
.
Ci-dessus, j'ai supposé que la sortie est "normal ", c'est-à-dire pas via appel 'exit()', ou en raison d'une erreur de segmentation, etc. –
Attention. Ce n'est pas garanti de travailler. Si une exception s'échappe de main(), alors l'implémentation est définie si la pile est déroulée. Donc, pour garantir cela, vous devez attraper toutes les exceptions dans main() (en plaçant votre code dans le bloc try). Vous n'avez pas besoin de faire quoi que ce soit juste de repenser l'exception afterwords. –
Pas pour tout type de terminaison; il y a des signaux conçus pour ne pas être manipulés, comme KILL sur Linux. Ces signaux sont conçus pour mettre fin à un programme qui a consommé toute la mémoire, le processeur ou d'autres ressources, et a laissé l'ordinateur dans un état qui rend difficile l'exécution d'une fonction gestionnaire.
- 1. Node.JS Shutdown Hook
- 2. ShutDown C# Project
- 3. App Shutdown C# Windows
- 4. C# shutdown/hibernate/sleep
- 5. Shutdown et WakeUp Script C#
- 6. C++ Alt-Tab Hook
- 7. WH_JOURNALPLAYBACK hook en C#
- 8. shutdown iOS par programmation
- 9. GraphDatabaseService Shutdown() non retourné
- 10. connexion pool shutdown android
- 11. Détecter linux shutdown
- 12. Developer Express, GDI + shutdown
- 13. WebDriver Correct Shutdown
- 14. Celerybeat shutdown - ordre d'initscript?
- 15. Erreur système Java ShutBuilder Shutdown
- 16. C# Application ne se terminant pas sur Shutdown (parfois)
- 17. Global Hook en C++ ne fonctionne pas?
- 18. C# ListView Hook Pre SizeChanged Événement
- 19. filtrage Hook question Keybords HKEYS dans c
- 20. Hook IDispatch v-table en C++
- 21. Linux Shutdown avec dbus-send
- 22. tomcat6 shutdown port n'écoute pas
- 23. Shutdown ExecutorService gracieusement dans webapp?
- 24. Comment interrompre Eclipse RCP shutdown
- 25. shutdown/undeploy tomcat from Servlet
- 26. ShutdownChannelGroupException à Apache Karaf Shutdown
- 27. Scala Databinder Dispatch Http shutdown
- 28. Drupal hook alter avec hook valider
- 29. Subversion post-commit hook
- 30. Hook CreateFileW
Ce n'est pas possible en Java non plus - tous les processus sans tenir compte de la langue ne peuvent pas attraper le signal 9 sur linux (et l'équivalent sur Windows) ou exécuter n'importe quel code quand ce signal arrive – Soren
Comme suggéré par @Drake, je choisirais [ atexit] (http://www.cplusplus.com/reference/cstdlib/atexit/). –