如何在CLI应用程序中“截取”Ctrl + C?

如何在CLI(命令行界面)Java应用程序中拦截 Ctrl + C (通常会终止进程)?

是否存在多平台解决scheme(Linux,Solaris,Windows)?

我正在使用ConsolereadLine() ,但是如果有必要,我可以使用其他一些方法从标准input中读取字符。

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

这应该能够拦截信号,但只能作为JVM完全closures之前的一个中间步骤,所以它可能不是你正在寻找的。

您需要使用SignalHandlersun.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兼容的,但是对于不同的版本可能会有很大的影响。