如何可以拦截 Ctrl + C 键 (通常会杀死处理)在CLI(命令行接口)的Java应用程序?
做了多平台解决方案存在(Linux,Solaris和Windows)中?
我使用的是Console
的readLine()
但如果有必要,我会用一些其他的方法来读取从标准输入的字符。
如何可以拦截 Ctrl + C 键 (通常会杀死处理)在CLI(命令行接口)的Java应用程序?
做了多平台解决方案存在(Linux,Solaris和Windows)中?
我使用的是Console
的readLine()
但如果有必要,我会用一些其他的方法来读取从标准输入的字符。
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() { /*
my shutdown code here
*/ }
});
这应该是能够拦截信号,而仅仅是JVM之前的中间步骤完全停产本身,所以它可能不会是你照顾什么。
你需要使用一个SignalHandler
( sun.misc.SignalHandler
)拦截SIGINT
通过按Ctrl + C(在Unix以及Windows上)触发信号。
请参阅这篇文章 (PDF,8页和第9)。
我假设你要安全关机,而不是做短路关机过程。 如果我的假设是正确的,那么你应该看看关闭挂钩 。
为了能够处理按Ctrl + C,而无需关闭出于某种原因,你需要使用某种形式的信号处理(因为按Ctrl + C输入实际上并没有直接传递到你的应用程序中,而是被处理其生成SIGINT然后被传递到Java操作系统。
见http://www.oracle.com/technetwork/java/javase/signals-139944.html对信号处理的详细信息。
(如果你只是想正常关闭,AKF的答案就足够了。)
有关如何处理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很多不同的版本。