Как я могу "перехватить" Ctrl+C в приложении CLI?
Как я могу перехватить Ctrl+C (который обычно убивает процесс) в Java-приложении CLI (интерфейс командной строки)?
Существует ли мультиплатформенное решение (Linux, Solaris, Windows)?
я использую Console
"s readLine()
, но при необходимости я мог бы использовать какой-то другой метод для чтения символов из стандартного ввода.
4 ответа
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).
Я предполагаю, что вы хотите корректно завершить работу, а не замыкать процесс выключения. Если мое предположение верно, то вы должны посмотреть на крючки выключения.
Чтобы иметь возможность обрабатывать Ctrl+C без выключения по какой-либо причине, вам необходимо использовать некоторую форму обработки сигналов (поскольку ввод Ctrl+C фактически не передается непосредственно в ваше приложение, а вместо этого обрабатывается ОС, которая генерирует SIGINT, который затем передается в Java.
См. http://www.oracle.com/technetwork/java/javase/signals-139944.html для получения подробной информации об обработке сигналов.
(Если вы просто хотите изящно завершить работу, ответ АКФ будет достаточным.)
Несколько ссылок о том, как обращаться с 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, но может сильно зависеть от разных версий.