Come posso "intercettare" Ctrl + C in un'applicazione CLI?


85

Come posso intercettare Ctrl + C(che normalmente ucciderebbe il processo) in un'applicazione Java CLI (interfaccia a riga di comando)?

Esiste una soluzione multipiattaforma (Linux, Solaris, Windows)?

Sto usando quelli Consoledi readLine(), ma se necessario, potrei usare qualche altro metodo per leggere i caratteri dallo standard input.

Risposte:


121
Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() { /*
       my shutdown code here
    */ }
 });

Questo dovrebbe essere in grado di intercettare il segnale, ma solo come passaggio intermedio prima che la JVM si spenga completamente da sola, quindi potrebbe non essere quello che stai cercando.

È necessario utilizzare una SignalHandler( sun.misc.SignalHandler) per intercettare il SIGINTsegnale attivato da un Ctrl+ C(su Unix così come su Windows).
Vedi questo articolo (pdf, pagine 8 e 9).


5
@MartijnCourteaux Ciò accade dopo cinque anni;) Ho trovato una fonte simile su questo argomento e ho modificato il collegamento di conseguenza.
VonC

@VonC - È di nuovo morto
Gurwinder Singh

@GurV Quale collegamento? La modifica che ho fatto ad aprile 2014 ( stackoverflow.com/revisions/… ) è ancora valida: puoi ancora scaricare il file pdf ..
VonC

16

Suppongo che tu voglia spegnere con grazia e non cortocircuitare il processo di spegnimento. Se la mia ipotesi è corretta, dovresti dare un'occhiata a Shutdown Hooks .


Mai sentito parlare di ganci di arresto prima. Grazie!
ivan_ivanovich_ivanoff

8

Per poter gestire Ctrl+ Csenza spegnersi per qualche motivo, è necessario utilizzare una qualche forma di gestione del segnale (poiché l' ingresso Ctrl+ Cnon è effettivamente passato direttamente all'applicazione, ma è invece gestito dal sistema operativo che genera un SIGINT che viene poi passato a Java.

Vedere http://www.oracle.com/technetwork/java/javase/signals-139944.html per i dettagli sulla gestione del segnale.

(Se vuoi solo spegnere con grazia, la risposta di akf sarà sufficiente.)


4

Alcuni link su come gestire SIGTERM - questo è il segnale che il programma sta ricevendo dal lato OS:

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/

Dovrebbe funzionare sui sistemi operativi POSIX - cioè, Mac e Unix dovrebbero funzionare, su Windows non ne sono sicuro, ricordo di aver sentito che è anche compatibile POSIX in una certa misura, ma potrebbe variare molto con versioni diverse.


1
Il secondo collegamento fallisce. È stato modificato in Oracle su oracle.com/technetwork/java/javase/tsg-vm-149989.pdf ?
possibilità

Fallisce anche il terzo collegamento
Hugo Zaragoza
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.