2009-08-01 5 views
75

Wie kann ich abfangenCtrl +C (die normalerweise den Prozess töten würden) in einer CLI (Command Line Interface) Java-Anwendung?Wie kann ich Strg + C in einer CLI-Anwendung "abfangen"?

Gibt es eine Multi-Plattform-Lösung (Linux, Solaris, Windows)?

Ich verwende Console 's readLine(), aber wenn nötig, könnte ich eine andere Methode verwenden, um Zeichen von Standardeingabe zu lesen.

Antwort

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

Dies sollte in der Lage, das Signal abzufangen, sondern nur als Zwischenschritt vor der JVM vollständig Abschaltungen selbst, so dass es möglicherweise nicht, was Sie nach suchen.

Sie benötigen ein SignalHandler (sun.misc.SignalHandler) verwenden, um das SIGINT Signal von einem Ctrl +C (unter Unix als auch unter Windows) ausgelöst abzufangen.
Siehe this article (pdf, Seite 8 und 9).

+0

Link ist tot ... –

+5

@MartijnCourteaux Das passiert nach fünf Jahren;) Ich habe eine ähnliche Quelle zu diesem Thema gefunden und den Link entsprechend geändert. – VonC

+0

@VonC - Es ist wieder tot – GurV

15

Ich gehe davon aus, dass Sie ordnungsgemäß herunterfahren möchten, und den Shutdown-Prozess nicht kurzschließen. Wenn meine Annahme richtig ist, dann sollten Sie sich Shutdown Hooks ansehen.

+0

Noch nie von Shutdown-Hooks gehört. Vielen Dank! –

7

Um Ctrl +C ohne Herunterfahren aus irgendeinem Grunde zu handhaben zu können, werden Sie Umgang mit irgendeiner Form von Signal verwenden müssen (da der Ctrl +C Eingang nicht ist tatsächlich direkt an Ihre Anwendung übergeben, sondern durch das Betriebssystem behandelt wird, die eine SIGINT erzeugt, die dann an Java übergeben wird.

http://www.oracle.com/technetwork/java/javase/signals-139944.html Einzelheiten zur Signalbehandlung.

(Wenn Sie gerade wollen anmutig shutdown, Antwort der akf genügt.)

4

Einige Links wie SIGTERM zu handhaben - das ist das Signal des Programm auf der OS-Seite bekommen:

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/

Die auf POSIX-Betrieb funktionieren soll Systeme - das heißt, Mac und Unix sollten funktionieren, unter Windows bin ich mir nicht sicher, ich erinnere mich zu hören, dass es zu einem gewissen Grad auch POSIX-kompatibel ist, aber möglicherweise viel mit anderen varty Versionen.

+1

Die zweite Verbindung schlägt fehl .Wird es unter http://www.oracle.com/technetwork/java/javase/tsg-vm-149989.pdf zu Oracle geändert? – chance

+0

dritte Verbindung schlägt auch fehl –