如何在CLI应用程序中"拦截"Ctrl + C?

iva*_*off 81 java command-line stdin copy-paste command-line-interface

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

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

我使用ConsolereadLine(),但如果有必要,我会用一些其他的方法来读取从标准输入的字符.

Von*_*onC 118

Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() { /*
       my shutdown code here
    */ }
 });
Run Code Online (Sandbox Code Playgroud)

这应该能够拦截信号,但仅作为JVM完全关闭之前的中间步骤,因此它可能不是您正在寻找的.

您需要使用a SignalHandler(sun.misc.SignalHandler)来拦截SIGINTCtrl+ C(在Unix和Windows上)触发的信号.
请参阅此文章(pdf,第8页和第9页).

  • @MartijnCourteaux五年后发生;)我在该主题上找到了类似的来源,并相应地更改了链接. (5认同)

akf*_*akf 16

我假设你想优雅地关机,而不是短路关机过程.如果我的假设是正确的,那么你应该看看Shutdown Hooks.


Amb*_*ber 8

为了能够在不关闭的情况下处理Ctrl+ C,你需要使用某种形式的信号处理(因为Ctrl+ C输入实际上并没有直接传递给你的应用程序,而是由产生的OS处理然后传递给Java的SIGINT.

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

(如果你只是想要优雅地关闭,akf的答案就足够了.)