2009-08-04 12 views
7

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

+0

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

Odpowiedz

5

Możesz zajrzeć do shutdown hooks.

Ponadto, jest to prawdopodobnie duplikatem lub prawie duplikat tej poprzednie SO pytanie z dzień lub dwa temu:

How can I "intercept" Ctrl+C in a CLI application?

+0

Czy haki zamykające działają nawet wtedy, gdy JVM jest nieprawidłowo zakończona? Wątpię w to. –

+0

@mmyers, to zależy od twojej definicji nienormalności. :) Ctrl-C generalnie je wyzwoli. Zamknięcie terminala z reguły nie. – jsight

+1

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

2

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.