Wie kann ich Strg + C in einer CLI-Anwendung abfangen?


85

Wie kann ich + (was normalerweise den Prozess abbricht) in einer CLI-Java-Anwendung (Befehlszeilenschnittstelle) abfangen ?CtrlC

Gibt es eine plattformübergreifende Lösung (Linux, Solaris, Windows)?

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

Antworten:


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

Dies sollte in der Lage sein, das Signal abzufangen, jedoch nur als Zwischenschritt, bevor sich die JVM vollständig abschaltet, sodass es möglicherweise nicht das ist, wonach Sie suchen.

Sie müssen ein SignalHandler( sun.misc.SignalHandler) verwenden, um das SIGINTdurch ein Ctrl+ ausgelöste Signal abzufangen C(sowohl unter Unix als auch unter Windows).
Siehe diesen Artikel (pdf, Seite 8 und 9).


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

@VonC - Es ist wieder tot
Gurwinder Singh

@GurV Welcher Link? Die Bearbeitung, die ich im April 2014 vorgenommen habe ( stackoverflow.com/revisions/… ), ist weiterhin gültig: Sie können die PDF-Datei weiterhin herunterladen.
VonC

16

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


Noch nie von Abschalthaken gehört. Danke dir!
ivan_ivanovich_ivanoff

8

Um Ctrl+ verarbeiten zu können, Cohne aus irgendeinem Grund herunterzufahren, müssen Sie eine Form der Signalbehandlung verwenden (da der Ctrl+ CEingang nicht direkt an Ihre Anwendung übergeben wird, sondern vom generierenden Betriebssystem verarbeitet wird Ein SIGINT, das dann an Java übergeben wird.

Weitere Informationen zur Signalverarbeitung finden Sie unter http://www.oracle.com/technetwork/java/javase/signals-139944.html .

(Wenn Sie nur ordnungsgemäß herunterfahren möchten, reicht die Antwort von akf aus.)


4

Einige Links zum Umgang mit SIGTERM - das ist das Signal, das das Programm auf der Betriebssystemseite erhält:

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/

Das sollte unter POSIX-Betriebssystemen funktionieren - das heißt, Mac und Unix sollten funktionieren. Unter Windows bin ich mir nicht sicher.


1
Die zweite Verbindung schlägt fehl. Wird es unter oracle.com/technetwork/java/javase/tsg-vm-149989.pdf in Oracle geändert ?
Chance

Der dritte Link schlägt ebenfalls fehl
Hugo Zaragoza,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.