Вопрос по stdin, java, command-line, copy-paste, command-line-interface – Как я могу «перехватить» Ctrl + C в приложении CLI?

78

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

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

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

Ваш Ответ

4   ответа
8

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

Увидетьhttp://www.oracle.com/technetwork/java/javase/signals-139944.html для деталей об обработке сигналов.

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

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

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

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

Никогда раньше не слышал о крюках отключения. Спасибо! ivan_ivanovich_ivanoff
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-совместимый в некоторой степени, но может сильно зависеть от разных версий.

Вторая ссылка не работает. Это изменилось на Oracle вoracle.com/technetwork/java/javase/tsg-vm-149989.pdf?
третья ссылка тоже не работает

Похожие вопросы