我怎样才能在CLI(命令行界面)Java应用程序中拦截Ctrl+C(通常会终止进程)?
是否存在跨平台的解决方案(Linux、Solaris、Windows)?
我正在使用Console
的readLine()
方法,但如果需要,我可以使用其他方法从标准输入读取字符。
我怎样才能在CLI(命令行界面)Java应用程序中拦截Ctrl+C(通常会终止进程)?
是否存在跨平台的解决方案(Linux、Solaris、Windows)?
我正在使用Console
的readLine()
方法,但如果需要,我可以使用其他方法从标准输入读取字符。
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() { /*
my shutdown code here
*/ }
});
这应该能够拦截信号,但仅作为JVM完全关闭之前的中间步骤,因此可能不是您正在寻找的内容。
您需要使用一个SignalHandler
(sun.misc.SignalHandler
) 来拦截由 Ctrl+C 触发的 SIGINT
信号 (在Unix和Windows上都是如此)。
请参阅此文章 (pdf, 第8页和第9页)。
我假设您想要优雅地关闭,而不是短路关机过程。如果我的假设正确,那么您应该查看Shutdown Hooks。
关于如何处理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兼容,但可能会因不同版本而有所不同。