2009-08-01 9 views
75

¿Cómo puedo intercepciónCtrl +C (que normalmente mataría al proceso) en una aplicación CLI (interfaz de línea de comandos) de Java?¿Cómo puedo "interceptar" Ctrl + C en una aplicación CLI?

¿Existe una solución multiplataforma (Linux, Solaris, Windows)?

Estoy usando Console 's readLine(), pero si es necesario, podría utilizar algún otro método para leer los caracteres de la entrada estándar.

Respuesta

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

Esto debería ser capaz de interceptar la señal, pero sólo como un paso intermedio antes de la JVM por completo en sí paradas, por lo que no puede ser lo que está buscando después.

Es necesario utilizar un SignalHandler (sun.misc.SignalHandler) para interceptar la señal SIGINT provocado por un Ctrl +C (en Unix, así como en Windows).
Ver this article (pdf, página 8 y 9).

+0

El enlace está muerto ... –

+5

@MartijnCourteaux Eso sucede después de cinco años;) He encontrado una fuente similar sobre ese tema y he cambiado el enlace en consecuencia. – VonC

+0

@VonC - Está muerto nuevamente – GurV

15

Supongo que desea apagar correctamente y no provocar un cortocircuito en el proceso de apagado. Si mi suposición es correcta, entonces debe mirar Shutdown Hooks.

+0

Nunca escuché sobre los ganchos de apagado antes. ¡Gracias! –

7

Con el fin de ser capaz de manejar Ctrl +C sin necesidad de apagar por alguna razón, tendrá que utilizar algún tipo de señal de manipulación (ya que el Ctrl +C de entrada no es en realidad pasó directamente a su aplicación, sino que es manejado por el sistema operativo que genera un SIGINT que se pasa luego a Java.

Ver http://www.oracle.com/technetwork/java/javase/signals-139944.html para obtener información sobre el manejo de señales.

(Si acaba de querer apagado de precaución, la respuesta de akf será suficiente.)

4

Algunos enlaces sobre cómo manejar SIGTERM - que es la señal de que el programa está recibiendo en el lado SO:

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/

que debe funcionar en funcionamiento POSIX sistemas - es decir, Mac y Unix deberían funcionar, en Windows no estoy seguro, recuerdo haber escuchado que también es compatible con POSIX hasta cierto punto, pero podría varty mucho con diferentes versiones.

+1

Falló el segundo enlace .¿Se ha cambiado a Oracle al http://www.oracle.com/technetwork/java/javase/tsg-vm-149989.pdf? – chance

+0

tercer enlace también falla –

Cuestiones relacionadas