如何在 CLI(命令行界面)Java 应用程序中拦截 Ctrl+ C(通常会终止进程)?
是否存在多平台解决方案(Linux、Solaris、Windows)?
我正在使用Console
's readLine()
,但如有必要,我可以使用其他方法从标准输入中读取字符。
如何在 CLI(命令行界面)Java 应用程序中拦截 Ctrl+ C(通常会终止进程)?
是否存在多平台解决方案(Linux、Solaris、Windows)?
我正在使用Console
's readLine()
,但如有必要,我可以使用其他方法从标准输入中读取字符。
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() { /*
my shutdown code here
*/ }
});
这应该能够拦截信号,但仅作为 JVM 完全关闭自身之前的中间步骤,因此它可能不是您所关心的。
您需要使用SignalHandler
( sun.misc.SignalHandler
) 来拦截由+SIGINT
触发的信号(在 Unix 和 Windows 上)。
请参阅本文(pdf,第 8 页和第 9 页)。CtrlC
我假设您想正常关机,而不是短路关机过程。如果我的假设是正确的,那么您应该查看Shutdown Hooks。
为了能够在不因某种原因关闭的情况下处理Ctrl+ C,您需要使用某种形式的信号处理(因为Ctrl+C输入实际上并未直接传递给您的应用程序,而是由生成的操作系统处理然后传递给 Java 的 SIGINT。
有关信号处理的详细信息,请参见http://www.oracle.com/technetwork/java/javase/signals-139944.html。
(如果你只是想优雅地关机,akf 的回答就足够了。)
关于如何处理 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 兼容的,但不同版本可能会有很多变化。