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.

ivan_ivanovich_ivanoff
quelle

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).

VonC
quelle
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 .

akf
quelle
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.)

Bernstein
quelle
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.

Henning
quelle
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,