2009-08-01 11 views
75

Jak mogę przechwytującyCtrl + C (która normalnie byłaby zabić proces) w aplikacji CLI (interfejs wiersza poleceń) Java?Jak mogę "przechwycić" Ctrl + C w aplikacji CLI?

Czy istnieje rozwiązanie wieloplatformowe (Linux, Solaris, Windows)?

Używam ConsolereadLine(), ale w razie potrzeby mogę użyć innej metody , aby odczytać znaki ze standardowego wejścia.

Odpowiedz

112
Runtime.getRuntime().addShutdownHook(new Thread() { 
    public void run() { /* 
     my shutdown code here 
    */ } 
}); 

ten powinien być zdolny do przechwytywania sygnału, lecz jedynie jako etap pośredni przed JVM się całkowicie postojów, więc to nie może być to, czego szukasz po.

Musisz użyć SignalHandler (sun.misc.SignalHandler), aby przechwycić sygnał SIGINT wyzwalany przez Ctrl + C (na Unix, jak i Windows).
Zobacz this article (pdf, strona 8 i 9).

+0

Link jest martwy ... –

+5

@MartijnCourteaux To się dzieje po pięciu latach;) Znalazłem podobne źródło na ten temat i zmieniłem odpowiednio odnośnik. – VonC

+0

@VonC - Znowu jest martwe – GurV

15

Zakładam, że chcesz zamknąć się z wdziękiem, a nie zwarcia procesu zamykania. Jeśli moje założenie jest poprawne, powinieneś spojrzeć na Shutdown Hooks.

+0

Nigdy wcześniej nie słyszano o hakach wyłączających. Dziękuję Ci! –

7

Aby móc obsłużyć Ctrl + C bez wyłączania z jakiegoś powodu trzeba użyć jakiejś formy sygnału magazynowe (od + C wejście Ctrl nie jest rzeczywiście przekazywane bezpośrednio do aplikacji, ale zamiast tego jest obsługiwane przez system operacyjny, który wytwarza SIGINT, który jest następnie przekazywany do Javy.

Zobacz http://www.oracle.com/technetwork/java/javase/signals-139944.html szczegółowe informacje na temat obsługi sygnału.

(Jeśli tylko chce wdzięcznie shutdown, odpowiedź AKF będzie wystarczające.)

4

Niektóre linki o jak obsługiwać SIGTERM - to sygnałem, że program staje się po stronie OS:

http://blog.webinf.info/2008/08/intercepting-sigterm.html

http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/signals.html

http://www.ibm.com/developerworks/java/library/i-signalhandling/

który powinien działać na operacyjny POSIX systemy - to znaczy, Mac i Unix powinny działać, w oknach, których nie jestem pewien, pamiętam, że jest w pewnym stopniu kompatybilny z POSIX, ale może być bardzo sprzeczny z różnymi wersje.

+1

Drugie połączenie nie powiedzie się .Czy zostało zmienione na Oracle pod adresem http://www.oracle.com/technetwork/java/javase/tsg-vm-149989.pdf? – chance

+0

trzeci link również się nie udaje –