代码之家  ›  专栏  ›  技术社区  ›  ivan_ivanovich_ivanoff

如何在cli应用程序中“截获”ctrl+c?

  •  78
  • ivan_ivanovich_ivanoff  · 技术社区  · 15 年前

    我怎么能 拦截 Ctrl键 + C (通常会杀死进程) 在CLI(命令行接口)Java应用程序中?

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

    我在用 Console readLine() 如果必要的话,我可以用其他方法 从标准输入中读取字符。

    4 回复  |  直到 8 年前
        1
  •  116
  •   Abhishek    9 年前
    Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() { /*
           my shutdown code here
        */ }
     });
    

    这应该能够截获信号,但只是在JVM完全关闭之前的一个中间步骤,所以它可能不是您所关注的。

    你需要使用 SignalHandler ( sun.misc.SignalHandler )截获 SIGINT 由A触发的信号 Ctrl键 + C (在Unix和Windows上)。
    this article (PDF,第8页和第9页)。

        2
  •  16
  •   akf    15 年前

    我假设您希望正常关机,而不是使关机过程短路。如果我的假设是正确的,那么你应该看看 Shutdown Hooks .

        3
  •  8
  •   Chriki    8 年前

    为了能够处理 Ctrl键 + C 在没有因故关闭的情况下,您需要使用某种形式的信号处理(因为 Ctrl键 + C 输入并不是直接传递给应用程序,而是由生成SIGITT的操作系统处理,然后将其传递给Java。

    http://www.oracle.com/technetwork/java/javase/signals-139944.html 有关信号处理的详细信息。

    (如果你只是想优雅地关机,AKF的答案就足够了。)

        4
  •  4
  •   Henning    15 年前

    一些关于如何处理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,但在不同的版本上可能会有很多差异。