Mam program java, który tworzy plik blokady, aby upewnić się, że inne wykonania nie działają w tym samym czasie. Jeśli program zostanie uruchomiony, tworzy plik, a po wyjściu, albo pomyślnie, albo za pośrednictwem wyjątku, plik zostanie usunięty. Ale jeśli użytkownik trafi Ctrl + C, zamknie terminal lub w inny sposób przerwie wykonywanie, plik nie zostanie usunięty. Czy istnieje sposób, aby wykryć to polecenie przerwania i upewnić się, że plik jest również usuwany w tym przypadku?Jak pozwolić systemowi obsługi Java przerwać jak Ctrl + C
Odpowiedz
Możesz zajrzeć do shutdown hooks.
Ponadto, jest to prawdopodobnie duplikatem lub prawie duplikat tej poprzednie SO pytanie z dzień lub dwa temu:
Czy haki zamykające działają nawet wtedy, gdy JVM jest nieprawidłowo zakończona? Wątpię w to. –
@mmyers, to zależy od twojej definicji nienormalności. :) Ctrl-C generalnie je wyzwoli. Zamknięcie terminala z reguły nie. – jsight
Nie ma 100% niezawodnego sposobu na usunięcie takich plików blokujących. Znaczniki czasu mogą pomóc, ale dzieje się to kosztem konieczności zapisu dysku co kilka sekund. Wiele programów po uruchomieniu szuka pliku blokującego i pyta o to użytkownika. – Amber
Jedynym dobrym sposobem radzenia sobie z tym jest timestamp plik dziennika i aktualizuj plik dziennika z nowym znacznikiem czasu co kilka sekund. File.deleteOnExit pomoże, ale żadna metoda nie jest niezawodna (co się stanie, gdy ktoś po prostu wyciągnie przewód zasilający?).
Jeśli piszesz znacznik czasu, możesz sprawdzić poprawny znacznik czasu (ostatnio zapisany) i zastąpić plik dziennika, jeśli jest zbyt nieaktualny. W ten sposób przestarzały plik blokujący nie będzie przeszkadzał użytkownikowi.
- 1. Jak przerwać odczyt na Java Socket?
- 2. Solaris GDB: jak przerwać wykonywanie?
- 3. Jak mogę złapać zdarzenie ctrl-c? (C++)
- 4. Jak przerwać kwerendę w powłoce javascript mongo
- 5. PySerial: Jak wysłać polecenie Ctrl-C na linii szeregowej
- 6. Przerwać DO podczas pętli Java?
- 7. Jak ładnie obsługiwać KeyboardInterrupt (Ctrl-c) z pycurl?
- 8. Ctrl + kliknięcie na linki z przyciskami obsługi kliknięć
- 9. Jak napisać handler Ctrl-C w Haskell?
- 10. Jak wysłać "Ctrl + c" w Sikuli?
- 11. Jak wysłać ctrl + z w C
- 12. Jak wyłączyć CTRL-C podczas skanowania scp?
- 13. Jak przerwać std :: thread?
- 14. Jak przerwać żądanie pobrania?
- 15. Jak przerwać wykonywanie selektora?
- 16. Jak przerwać wątki ExecutorService?
- 17. Jak przerwać Git Bisect
- 18. jak przerwać obsługę KVM
- 19. Jak mogę "przerwać" budowę gulpa
- 20. Wykrywanie CTRL + C w node.js
- 21. Jak mogę "przechwycić" Ctrl + C w aplikacji CLI?
- 22. Jak mogę zezwolić na takie rzeczy jak Ctrl-A i Ctrl-Backspace w C# TextBox
- 23. Jak pozwolić JSplitPane poruszać się gładko?
- 24. Jak pozwolić MagicMockowi zachowywać się jak dyktando?
- 25. Jak wysłać ctrl + c do procesu w języku C#?
- 26. Jak zatrzymać/przerwać boost :: thread?
- 27. Jak przerwać raport Crystal Report:
- 28. Jak przerwać wywoływanie funkcji PowerShell
- 29. Jak przerwać sesję w Magento?
- 30. Jak przerwać słuchanie kanału socket.io?
Jak na ironię, zapomniałem o tym pytaniu i [odpowiedział] (https://stackoverflow.com/a/34188676/113632) związany sześć lat (i związane z nim doświadczenie w świecie rzeczywistym) później. @Amber ma absolutną rację, że większość aplikacji Java powinna używać haków zamykających, ale * właściwie * obsługiwać 'SIGINT' i inne sygnały, które musisz użyć' sun.misc.Signal', jak omówiono w połączonym pytaniu. – dimo414