Como eu posso “interceptar” Ctrl + C em um aplicativo CLI?
-
06-07-2019 - |
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.
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>