我该如何截取 Ctrl+C在CLI(命令行界面)Java应用程序中(通常会杀死进程)?
是否存在多平台解决方案(Linux,Solaris,Windows)?
我使用Console
的是readLine()
,但是如有必要,我可以使用其他方法从标准输入中读取字符。
我该如何截取 Ctrl+C在CLI(命令行界面)Java应用程序中(通常会杀死进程)?
是否存在多平台解决方案(Linux,Solaris,Windows)?
我使用Console
的是readLine()
,但是如有必要,我可以使用其他方法从标准输入中读取字符。
Answers:
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输入实际上并未直接传递给您的应用程序,而是由生成该文件的OS处理SIGINT,然后将其传递给Java。
有关信号处理的详细信息,请参见http://www.oracle.com/technetwork/java/javase/signals-139944.html。
(如果您只是想正常关机,则akf的答案就足够了。)
有关如何处理SIGTERM的一些链接-这是程序进入OS端的信号:
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兼容,但是不同版本可能会有很多差异。