如何在CLI应用程序中“截取”Ctrl + C?
如何在CLI(命令行界面)Java应用程序中拦截 Ctrl + C (通常会终止进程)?
是否存在多平台解决scheme(Linux,Solaris,Windows)?
我正在使用Console
的readLine()
,但是如果有必要,我可以使用其他一些方法从标准input中读取字符。
Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { /* my shutdown code here */ } });
这应该能够拦截信号,但只能作为JVM完全closures之前的一个中间步骤,所以它可能不是你正在寻找的。
您需要使用SignalHandler
( sun.misc.SignalHandler
)来截取由Ctrl + C (在Unix以及Windows上)触发的SIGINT
信号。
看到这篇文章 (pdf,第8和9页)。
我假设你想要优雅地closures,而不是做短路关机过程。 如果我的假设是正确的,那么你应该看看Shutdown Hooks 。
为了能够在不出于某种原因closures的情况下处理Ctrl + C ,您需要使用某种forms的信号处理(因为Ctrl + Cinput实际上并不直接传递给您的应用程序,而是由生成一个SIGINT然后传递给Java的OS。
有关信号处理的详细信息,请参见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兼容的,但是对于不同的版本可能会有很大的影响。