Як я можу “перехопити” Ctrl + C у програмі CLI?


85

Як я можу перехопити Ctrl + C(що зазвичай вбиває процес) у програмі Java CLI (інтерфейс командного рядка)?

Чи існує багатоплатформене рішення (Linux, Solaris, Windows)?

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

Відповіді:


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


5
@MartijnCourteaux Це відбувається через п'ять років;) Я знайшов подібне джерело на цю тему і відповідно змінив посилання.
VonC

@VonC - Знову мертве
Gurwinder Singh

@GurV Яке посилання? Редагування, яке я зробив у квітні 2014 року ( stackoverflow.com/revisions/… ), все ще діє: ви все ще можете завантажити файл у форматі PDF ..
VonC

16

Я припускаю, що ви хочете вимкнути витончено, а не виконувати коротке замикання процесу вимкнення. Якщо моє припущення вірне, то вам слід подивитися на гачки відключення .


Ніколи раніше не чув про гачки відключення. Дякую!
ivan_ivanovich_ivanoff

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 ?
шанс

не вдається і третя ланка
Уго Сарагоса
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.