86

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

是否存在多平台解决方案(Linux、Solaris、Windows)?

我正在使用Console's readLine(),但如有必要,我可以使用其他方法从标准输入中读取字符。

4

4 回答 4

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

这应该能够拦截信号,但仅作为 JVM 完全关闭自身之前的中间步骤,因此它可能不是您所关心的。

您需要使用SignalHandler( sun.misc.SignalHandler) 来拦截由+SIGINT触发的信号(在 Unix 和 Windows 上)。 请参阅本文(pdf,第 8 页和第 9 页)。CtrlC

于 2009-08-01T08:40:08.743 回答
16

我假设您想正常关机,而不是短路关机过程。如果我的假设是正确的,那么您应该查看Shutdown Hooks

于 2009-08-01T08:35:30.063 回答
8

为了能够在不因某种原因关闭的情况下处理Ctrl+ C,您需要使用某种形式的信号处理(因为Ctrl+C输入实际上并未直接传递给您的应用程序,而是由生成的操作系统处理然后传递给 Java 的 SIGINT。

有关信号处理的详细信息,请参见http://www.oracle.com/technetwork/java/javase/signals-139944.html

(如果你只是想优雅地关机,akf 的回答就足够了。)

于 2009-08-01T08:39:21.243 回答
4

关于如何处理 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 兼容的,但不同版本可能会有很多变化。

于 2009-08-01T08:42:33.810 回答