Pergunta

Como posso interceptação Ctrl + C (que normalmente iria matar o processo) em uma CLI (interface de linha de comando) aplicação Java?

Será que uma solução exist multi-plataforma (Linux, Solaris, Windows)?

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

Foi útil?

Solução

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

Este deve ser capaz de interceptar o sinal, mas apenas como uma etapa intermediária antes da JVM se completamente paradas, por isso não pode ser o que você está procurando depois.

Você precisa usar um SignalHandler (sun.misc.SignalHandler) para interceptar o sinal SIGINT desencadeada por uma Ctrl + C (em Unix, bem como no Windows).
Consulte este artigo (pdf, página 8 e 9).

Outras dicas

Eu estou supondo que você quer desligar graciosamente, e não fazer curto-circuito o processo de desligamento. Se a minha suposição é correta, então você deve olhar para Shutdown Hooks .

A fim de ser capaz de lidar com Ctrl + C sem desligar por algum motivo, você vai precisar usar alguma forma de manipulação de sinal (uma vez que o Ctrl + C entrada não é realmente passado diretamente para a sua aplicação, mas em vez disso é tratado pelo sistema operacional que gera um SIGINT que é então passado para Java.

http://www.oracle.com/technetwork/ java / JavaSE / sinais de 139944.html para obter detalhes sobre a manipulação do sinal.

(Se você está apenas querendo desligamento graciosamente, a resposta de akf será suficiente.)

Alguns links sobre como lidar com SIGTERM - que é o sinal do programa está ficando do lado do OS:

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

http: //java.sun .com / JavaSE / 6 / WebNotes / problemas / TSG-VM / html / signals.html

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

Isso deve funcionar em sistemas operacionais POSIX - isto é, Mac e Unix deve funcionar, em janelas Eu não tenho certeza, eu lembro de ter ouvido também é POSIX compatível, até certo ponto, mas pode Varty muito com versões diferentes <. / p>

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top