it-swarm.com.de

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

Wie kann ich abfangen Ctrl+C (was normalerweise den Prozess beenden würde) in einer CLI (Befehlszeilenschnittstelle) Java Anwendung?

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

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

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 die JVM sich selbst vollständig herunterfährt, sodass es möglicherweise nicht das ist, wonach Sie suchen.

Sie müssen ein SignalHandler (Sun.misc.SignalHandler) um das von a ausgelöste SIGINT Signal abzufangen Ctrl+C (sowohl unter Unix als auch unter Windows).
Siehe dieser Artikel (pdf, Seite 8 und 9).

117
VonC

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

16
akf

Um damit umgehen zu können Ctrl+C ohne aus irgendeinem Grund herunterzufahren, müssen Sie eine Form der Signalverarbeitung verwenden (da die Ctrl+C Die Eingabe wird nicht direkt an Ihre Anwendung übergeben, sondern vom Betriebssystem verarbeitet, das ein SIGINT generiert, 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.)

8
Amber

Einige Links zum Umgang mit SIGTERM - das ist das Signal, das das Programm auf der Seite des Betriebssystems 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 auf POSIX-Betriebssystemen funktionieren - das heißt, Mac und Unix sollten auf Windows funktionieren. Ich bin mir nicht sicher, wie ich hörte, ist es in gewissem Maße auch POSIX-kompatibel, kann aber mit verschiedenen Versionen sehr unterschiedlich sein.

4
Henning