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

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

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

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


person ivan_ivanovich_ivanoff    schedule 01.08.2009    source источник


Ответы (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).

person VonC    schedule 01.08.2009
comment
@MartijnCourteaux Это происходит через пять лет;) Я нашел аналогичный источник по этой теме и соответствующим образом изменил ссылку. - person VonC; 11.04.2014
comment
@VonC - Он снова мертв - person Gurwinder Singh; 03.12.2017
comment
@GurV Какая ссылка? Редактирование, которое я сделал в апреле 2014 г. (stackoverflow.com/revisions/), все еще в силе: вы все еще можете скачать файл pdf.. - person VonC; 03.12.2017

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

person akf    schedule 01.08.2009
comment
Никогда раньше не слышал о хуках выключения. Спасибо! - person ivan_ivanovich_ivanoff; 01.08.2009

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

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

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

person Amber    schedule 01.08.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, но может сильно отличаться от разных версий.

person Henning    schedule 01.08.2009
comment
Вторая ссылка не работает. Изменен ли он на Oracle на oracle.com/technetwork/java/ javase/tsg-vm-149989.pdf? - person chance; 08.04.2011
comment
третья ссылка тоже не работает - person Hugo Zaragoza; 24.10.2016