Как мне & # 8220; перехватить & # 8221; Ctrl + C в приложении CLI?
-
06-07-2019 - |
Вопрос
Как я могу перехватить Ctrl + C (что обычно приводит к остановке процесса) в приложении Java CLI (интерфейс командной строки)?
Существует ли мультиплатформенное решение (Linux, Solaris, Windows)?
Я использую консоль
readLine ()
, но при необходимости я мог бы использовать другой метод
читать символы из стандартного ввода.
Решение
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 / signal-139944.html для получения дополнительной информации об обработке сигналов.
(Если вы просто хотите изящно завершить работу, ответ AKF будет достаточным.)
Несколько ссылок о том, как обращаться с SIGTERM - это сигнал, который программа получает на стороне ОС:
http://blog.webinf.info/2008/08/intercepting -sigterm.html р>
http: //java.sun .com / JavaSE / 6 / webnotes / тревога / TSG-VM / HTML / signals.html
http://www.ibm.com/developerworks/java/ библиотека / я-signalhandling /
Это должно работать в операционных системах POSIX, то есть Mac и Unix должны работать, в Windows я не уверен, я помню, что слышал, что он также в некоторой степени совместим с POSIX, но может сильно зависеть от разных версий. р>