【问题标题】:How can I "intercept" Ctrl+C in a CLI application?如何在 CLI 应用程序中“拦截”Ctrl+C?
【发布时间】:2010-11-16 00:21:25
【问题描述】:

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

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

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

【问题讨论】:

    标签: java command-line stdin command-line-interface copy-paste


    【解决方案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 月 (stackoverflow.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,但可能会因不同版本而变化很多。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 1970-01-01
      相关资源
      最近更新 更多