Как я могу «перехватить» Ctrl + C в приложении CLI? - PullRequest
80 голосов
/ 01 августа 2009

Как я могу перехватить Ctrl + C (что обычно убивает процесс) в CLI (интерфейс командной строки) Java-приложения?

Существует ли мультиплатформенное решение (Linux, Solaris, Windows)?

Я использую Console readLine(), но при необходимости я мог бы использовать другой метод читать символы из стандартного ввода.

Ответы [ 4 ]

117 голосов
/ 01 августа 2009
Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() { /*
       my shutdown code here
    */ }
 });

Это должно быть в состоянии перехватить сигнал, но только в качестве промежуточного шага до того, как JVM полностью отключится, поэтому это может быть не то, что вы ищете.

Вам необходимо использовать SignalHandler (sun.misc.SignalHandler) для перехвата сигнала SIGINT, запускаемого Ctrl + C (в Unix а также на Windows).
См. эту статью (pdf, стр. 8 и 9).

16 голосов
/ 01 августа 2009

Я предполагаю, что вы хотите корректно завершить работу, а не замыкать процесс выключения. Если мое предположение верно, то вы должны посмотреть на Shutdown Hooks .

8 голосов
/ 01 августа 2009

Чтобы иметь возможность обрабатывать Ctrl + C без выключения по какой-либо причине, вам необходимо использовать некоторую форму обработки сигналов (поскольку Ctrl + C ввод фактически не передается непосредственно вашему приложению, а обрабатывается операционной системой, которая генерирует SIGINT, который затем передается в Java.

Подробнее об обработке сигналов см. http://www.oracle.com/technetwork/java/javase/signals-139944.html.

(Если вы просто хотите изящно завершить работу, ответ Акфа будет достаточным.)

4 голосов
/ 01 августа 2009

Некоторые ссылки о том, как обращаться с SIGTERM - это сигнал, который программа получает на стороне ОС:

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/

Это должно работать в операционных системах POSIX, то есть Mac и Unix должны работать, в Windows я не уверен, я помню, что слышал, что это также POSIX-совместимый в некоторой степени, но может сильно зависеть от разных версий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...