Pregunta

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

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

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

¿Fue útil?

Solución

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

Esto debería ser capaz de interceptar la señal, pero solo como un paso intermedio antes de que la JVM se apague completamente, por lo que puede que no sea lo que está buscando.

Debe usar una SignalHandler ( sun.misc.SignalHandler ) para interceptar la señal SIGINT activada por un Ctrl + C (en Unix y en Windows).
Consulte este artículo (pdf, página 8 y 9).

Otros consejos

Supongo que desea cerrar con gracia, y no cortocircuitar el proceso de apagado. Si mi suposición es correcta, entonces debería mirar Ganchos de apagado .

Para poder manejar Ctrl + C sin cerrar por alguna razón, necesitará usar alguna forma de manejo de señal (ya que La entrada Ctrl + C no se pasa directamente a su aplicación, sino que es manejada por el sistema operativo que genera un SIGINT que luego se pasa a Java.

Ver http://www.oracle.com/technetwork/ java / javase / signal-139944.html para obtener detalles sobre el manejo de la señal.

(Si solo desea cerrar con gracia, la respuesta de akf será suficiente).

Algunos enlaces sobre cómo manejar SIGTERM: esa es la señal que el programa recibe del lado del sistema operativo:

http://blog.webinf.info/2008/08/intercepting -sigterm.html

http: //java.sun .com / javase / 6 / webnotes / trouble / TSG-VM / html / señales.html

http://www.ibm.com/developerworks/java/ biblioteca / i-signalhandling /

Eso debería funcionar en los sistemas operativos POSIX, 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 variar mucho con diferentes versiones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top