如何在 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)?

我正在使用ConsolereadLine(),但如果需要,我可以使用其他方法 从标准输入中读取字符。

【问题讨论】:

【参考方案1】:
Runtime.getRuntime().addShutdownHook(new Thread() 
    public void run()  /*
       my shutdown code here
    */ 
 );

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

您需要使用SignalHandlersun.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?

如何在 iis 上部署 angular-cli 应用程序

本机 C++ 程序在使用 C++/CLI 和 C# 互操作 DLL 启动时崩溃

linux自动启动程序用ctrl+c无法终止

vb 如何使textbox不响应ctrl+x、ctrl+c、ctrl+v等系统消息

思科IOS中改善CLI的用户体验