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

85

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

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

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

ivan_ivanovich_ivanoff
источник

Ответы:

121
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).

VonC
источник
5
@MartijnCourteaux Это происходит через пять лет;) Я нашел аналогичный источник по этой теме и соответственно изменил ссылку.
VonC
@VonC - Он снова мертв
Гурвиндер Сингх
@GurV Какая ссылка? Редактирование, которое я сделал в апреле 2014 года ( stackoverflow.com/revisions/… ), все еще в силе: вы все еще можете скачать файл pdf ..
VonC
16

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

АКФ
источник
Никогда раньше не слышал о крючках отключения. Спасибо!
ivan_ivanovich_ivanoff 01
8

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

См. Http://www.oracle.com/technetwork/java/javase/signals-139944.html для получения подробной информации об обработке сигналов.

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

Янтарь
источник
4

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

Хеннинг
источник
1
Вторая ссылка не работает. Изменен ли он на Oracle на oracle.com/technetwork/java/javase/tsg-vm-149989.pdf ?
шанс
третье звено тоже не работает
Уго Сарагоса