如何在 CLI 应用程序中“拦截”Ctrl+C?
Posted
技术标签:
【中文标题】如何在 CLI 应用程序中“拦截”Ctrl+C?【英文标题】:How can I "intercept" Ctrl+C in a CLI application? 【发布时间】:2010-11-16 00:21:25 【问题描述】:我如何拦截 Ctrl+C(这通常会杀死进程) 在 CLI(命令行界面)Java 应用程序中?
是否存在多平台解决方案(Linux、Solaris、Windows)?
我正在使用Console
的readLine()
,但如果需要,我可以使用其他方法
从标准输入中读取字符。
【问题讨论】:
【参考方案1】: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 页)。
【讨论】:
@MartijnCourteaux 这发生在五年后;)我找到了关于该主题的类似来源并相应地更改了链接。 @VonC - 又死了 @GurV 哪个链接?我在 2014 年 4 月 (***.com/revisions/…) 所做的编辑仍然有效:您仍然可以下载 pdf 文件..【参考方案2】:我假设您想正常关机,而不是让关机过程短路。如果我的假设是正确的,那么你应该看看Shutdown Hooks。
【讨论】:
以前从未听说过关闭挂钩。谢谢!【参考方案3】:为了能够在不因某种原因关闭的情况下处理 Ctrl+C,您需要使用某种形式的信号处理(因为 Ctrl+C 输入实际上并没有直接传递给您的应用程序,而是由操作系统处理,生成一个 SIGINT 然后传递给 Java。
有关信号处理的详细信息,请参阅http://www.oracle.com/technetwork/java/javase/signals-139944.html。
(如果你只是想优雅地关机,akf的回答就足够了。)
【讨论】:
【参考方案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,但可能会因不同版本而变化很多。
【讨论】:
第二个链接失败。 oracle.com/technetwork/java/javase/tsg-vm-149989.pdf改成Oracle了吗? 第三个链接也失败了以上是关于如何在 CLI 应用程序中“拦截”Ctrl+C?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 JavaScript 检测 Ctrl+V、Ctrl+C?
本机 C++ 程序在使用 C++/CLI 和 C# 互操作 DLL 启动时崩溃