我如何“拦截” Ctrl + C键在CLI应用程序?(How can I “intercept” C

2019-06-17 21:50发布

如何可以拦截 Ctrl + C (通常会杀死处理)在CLI(命令行接口)的Java应用程序?

做了多平台解决方案存在(Linux,Solaris和Windows)中?

我使用的是ConsolereadLine()但如果有必要,我会用一些其他的方法来读取从标准输入的字符。

Answer 1:

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

这应该是能够拦截信号,而仅仅是JVM之前的中间步骤完全停产本身,所以它可能不会是你照顾什么。

你需要使用一个SignalHandlersun.misc.SignalHandler )拦截SIGINT通过按Ctrl + C(在Unix以及Windows上)触发信号。
请参阅这篇文章 (PDF,8页和第9)。



Answer 2:

我假设你要安全关机,而不是做短路关机过程。 如果我的假设是正确的,那么你应该看看关闭挂钩 。



Answer 3:

为了能够处理按Ctrl + C,而无需关闭出于某种原因,你需要使用某种形式的信号处理(因为按Ctrl + C输入实际上并没有直接传递到你的应用程序中,而是被处理其生成SIGINT然后被传递到Java操作系统。

见http://www.oracle.com/technetwork/java/javase/signals-139944.html对信号处理的详细信息。

(如果你只是想正常关闭,AKF的答案就足够了。)



Answer 4:

有关如何处理SIGTERM一些链接 - 这是程序在操作系统方面获得的信号:

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/

这应该对POSIX操作系统上运行 - 也就是说,Mac和Unix应该工作,在Windows上我不知道,我记得听到它也兼容POSIX在一定程度上,但可能varty很多不同的版本。



文章来源: How can I “intercept” Ctrl+C in a CLI application?