jest jakiś sposób uruchomienia kodu na zakończenie, bez względu na rodzaj zakończenia (nienormalny, normalny, nieprzechwycony wyjątek itp.)? Wiem, że jest to możliwe w Javie, ale czy jest to nawet możliwe w C++? Zakładam, że środowisko Windows.Shutdown Hook C++
Odpowiedz
Nie - jeśli ktoś powołuje TerminateProcess
, Twój proces zostanie zniszczona bez dalszych adieu, i (w szczególności) bez jakiejkolwiek szansy uruchomić dowolny kod w więcej proces zamykania.
To jest właściwa odpowiedź; jednakże, jak wskazują niektóre inne odpowiedzi, możesz ustawić obsługę wyjścia używając 'atexit()' i możesz złapać większość sygnałów za pomocą 'signal()' - jednak nigdy nie możesz podjąć żadnej akcji, jeśli ktoś wymusi zakończenie (byłby zabójca-9 na Linuksie, a sygnał 9 jest nieczytelny) – Soren
Dziękuję, faktycznie bałem się tego odpowiadam – Paranaix
także: assert(), abort(), zakończ() –
do normalnego zamknięcia applciation Proponuję
atexit()
Dobrym sposobem podejścia do tego problemu stosuje idiom C++ RAII, co oznacza tutaj, że operacje oczyszczania można umieścić w destructor obiektu, tj
class ShutdownHook {
~ShutdownHook() {
// exit handler code
}
};
int main() {
ShutdownHook h;
//...
}
Patrz Object Lifetime Manager w bibliotece ACE. W połączonym dokumencie omawiają także funkcję atexit
.
Powyżej założyłem, że wyjście jest "normalne" ", tzn. nie przez np wywołanie 'exit()' lub z powodu błędu segmentacji, itp. –
Ostrożnie. To nie gwarantuje działania. Jeśli wyjątek jest wyłączany w funkcji main(), wówczas w implementacji zdefiniowano, czy stos został rozwinięty. Aby zagwarantować to działanie, musisz przechwycić wszystkie wyjątki w main() (umieszczając swój kod w bloku try). Nie musisz nic robić, po prostu wyrzuć wyjątki. –
Nie do żadnego rodzaju rozwiązania; istnieją sygnały, które są zaprojektowane, aby nie być obsługiwane, jak KILL na Linuksie.
Sygnały te mają na celu zakończenie programu, który pochłonął całą pamięć, procesor lub inne zasoby, i pozostawił komputer w stanie, który utrudnia uruchomienie funkcji obsługi.
- 1. Dropwizard Shutdown Hook
- 2. C#: Keyboard Hook
- 3. C# Hook Global Keyboard Events - .net 4.0
- 4. Kiedy Haki Shutdown Przerwa Bad
- 5. Hook/Overlay to gra DirectX?
- 6. shutdown redis-server z linii poleceń
- 7. Problem Global Hook Keylogger
- 8. Git global hook customization
- 9. React-Router onChange hook
- 10. ASP.net MVC Validation Hook
- 11. Web hook w salesforce?
- 12. Pagedown Editor insertimagedialog hook
- 13. PowerShell Git Kod Hook Wyjście
- 14. C# low level hook myszy i obsługa zdarzeń formularza
- 15. Hook to time knitr chunks
- 16. Cygwin CTRL-C (przerwań sygnału) nie działa prawidłowo - JVM Shutdown Haki nie uruchamiające
- 17. Nie JNI_OnLoad znaleźć omijając INIT> Shutdown Application
- 18. Hook-up MethodInfo do pola delegata (FieldInfo)
- 19. Funkcja API Hook na funkcji obiektu COM?
- 20. Błąd Git push pre-receive hook odrzucono
- 21. Logowanie do Meteora - wylogowanie ~ hook/callback
- 22. Hook to Save Action w plugin Eclipse
- 23. Fuel UX - Hook na zdarzenie zmiany kreatora
- 24. Hook jquery działa tylko w przypadku kliknięcia?
- 25. pobierz wiadomość zatwierdzenia w git hook
- 26. Git Hook post-Receive dla witryny WWW
- 27. git pre-receive hook odmówił z heroku
- 28. Hook, aby dodać polecenia do kompilacji distutils?
- 29. Jenkins Partial Build/Modular Build na Commit Hook
- 30. Git przed zatwierdzeniem hook nie działa w systemie Windows
Nie jest to również możliwe w Javie - wszystkie procesy, niezależnie od języka, nie mogą przechwycić sygnału 9 na linuksie (i odpowiedniku w systemie Windows) lub uruchomić dowolny kod po nadejściu sygnału – Soren
Jak sugerował @Drake, chciałbym wybrać [ atexit] (http://www.cplusplus.com/reference/cstdlib/atexit/). –