Como posso “interceptar” Ctrl + C em um aplicativo CLI?

Como posso interceptar Ctrl + C (que normalmente mataria o processo) em um aplicativo Java CLI (interface de linha de comando)?

Existe uma solução multi-plataforma (Linux, Solaris, Windows)?

Eu estou usando o readLine() Console , mas se necessário, eu poderia usar algum outro método para ler caracteres da input padrão.

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

Isso deve ser capaz de interceptar o sinal, mas apenas como uma etapa intermediária antes que a JVM seja completamente encerrada, portanto, pode não ser o que você está procurando.

Você precisa usar um SignalHandler ( sun.misc.SignalHandler ) para interceptar o sinal SIGINT acionado por um Ctrl + C (no Unix e no Windows).
Veja este artigo (pdf, páginas 8 e 9).

Eu estou supondo que você deseja desligar graciosamente e não curto-circuito o processo de desligamento. Se a minha suposição estiver correta, você deve examinar os Ganchos de Desligamento .

Para poder controlar Ctrl + C sem desligar por algum motivo, você precisará usar alguma forma de manipulação de sinal (já que a input Ctrl + C não é passada diretamente para o seu aplicativo, mas é manipulada por o sistema operacional que gera um SIGINT que é então passado para o Java.

Consulte http://www.oracle.com/technetwork/java/javase/signals-139944.html para obter detalhes sobre o tratamento de sinal.

(Se você está apenas querendo desligar normalmente, a resposta da akf será suficiente.)

Alguns links sobre como lidar com SIGTERM – esse é o sinal que o programa está recebendo no lado do sistema operacional:

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/

Isso deve funcionar nos sistemas operacionais POSIX – ou seja, Mac e Unix devem funcionar, no Windows eu não tenho certeza, lembro-me de ouvir também é compatível com POSIX, mas pode muito muito com versões diferentes.