Как я могу" перехватить " Ctrl+C в приложении CLI?


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

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

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

4 77

4 ответа:

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

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

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

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

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

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

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

некоторые ссылки о том, как обрабатывать 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 в какой-то степени, но может быть много разных версий.