¿Cómo puedo “interceptar” Ctrl + C en una aplicación CLI?

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

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

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

 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 cierre completamente, por lo que puede no ser lo que está buscando.

Necesita utilizar un SignalHandler ( sun.misc.SignalHandler ) para interceptar la señal SIGINT activada por Ctrl + C (tanto en Unix como en Windows).
Vea este artículo (pdf, página 8 y 9).

Supongo que quiere apagar con gracia, y no cortocircuitar el proceso de apagado. Si mi suposición es correcta, entonces deberías mirar Shutdown Hooks .

Para poder manejar Ctrl + C sin apagar por alguna razón, necesitará usar algún tipo 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.

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

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

Algunos enlaces sobre cómo manejar SIGTERM: esa es la señal que está recibiendo el progtwig en el lado del sistema operativo:

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/

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 POSIX compatible hasta cierto punto, pero que puede varty mucho con diferentes versiones.