【发布时间】:2010-11-16 00:21:25
【问题描述】:
我如何拦截 Ctrl+C(这通常会杀死进程) 在 CLI(命令行界面)Java 应用程序中?
是否存在多平台解决方案(Linux、Solaris、Windows)?
我正在使用Console的readLine(),但如果需要,我可以使用其他方法
从标准输入中读取字符。
【问题讨论】:
标签: java command-line stdin command-line-interface copy-paste
我如何拦截 Ctrl+C(这通常会杀死进程) 在 CLI(命令行界面)Java 应用程序中?
是否存在多平台解决方案(Linux、Solaris、Windows)?
我正在使用Console的readLine(),但如果需要,我可以使用其他方法
从标准输入中读取字符。
【问题讨论】:
标签: java command-line stdin command-line-interface copy-paste
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() { /*
my shutdown code here
*/ }
});
这应该能够拦截信号,但只是作为 JVM 完全关闭自身之前的中间步骤,所以它可能不是你所关心的。
您需要使用SignalHandler(sun.misc.SignalHandler)来拦截由Ctrl+C触发的SIGINT信号(在 Unix 和 Windows 上)。
请参阅this article(pdf,第 8 页和第 9 页)。
【讨论】:
我假设您想正常关机,而不是让关机过程短路。如果我的假设是正确的,那么你应该看看Shutdown Hooks。
【讨论】:
为了能够在不因某种原因关闭的情况下处理 Ctrl+C,您需要使用某种形式的信号处理(因为 Ctrl+C 输入实际上并没有直接传递给您的应用程序,而是由操作系统处理,生成一个 SIGINT 然后传递给 Java。
有关信号处理的详细信息,请参阅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,但可能会因不同版本而变化很多。
【讨论】: