How can I "intercept" Ctrl+C in a CLI application?
Как я могу "перехватить" Ctrl + C в приложении CLI?
Как я могу перехватитьCtrl+C (который обычно завершает процесс) в приложении CLI Java (интерфейс командной строки)?
Существует ли мультиплатформенное решение (Linux, Solaris, Windows)?
Я использую Console's readLine(), но при необходимости я мог бы использовать какой-нибудь другой метод для чтения символов из стандартного ввода.
Переведено автоматически
Ответ 1
Runtime.getRuntime().addShutdownHook(newThread() { publicvoidrun() { /* my shutdown code here */ } });
Это должно позволять перехватывать сигнал, но только в качестве промежуточного шага перед полным завершением работы JVM, поэтому это может быть не то, что вам нужно.
Вам нужно использовать SignalHandler (sun.misc.SignalHandler) для перехвата SIGINT сигнала, запускаемого Ctrl+C (как в Unix, так и в Windows). Смотрите эту статью (pdf, стр. 8 и 9).
Ответ 2
Я предполагаю, что вы хотите завершить работу корректно, а не замыкать процесс завершения работы. Если мое предположение верно, то вам следует посмотреть на перехваты завершения работы.
Ответ 3
Чтобы иметь возможность обрабатывать Ctrl+C без выключения по какой-либо причине, вам нужно будет использовать некоторую форму обработки сигналов (поскольку ввод Ctrl+C фактически не передается непосредственно в ваше приложение, а вместо этого обрабатывается ОС, которая генерирует SIGINT, который затем передается в Java.
Это должно работать в операционных системах POSIX - то есть Mac и Unix должны работать, в Windows я не уверен, я помню, что слышал, что это также в некоторой степени совместимо с POSIX, но может сильно отличаться в разных версиях.