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


85

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

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

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

Answers:


121
Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() { /*
       my shutdown code here
    */ }
 });

这应该能够截获信号,但是仅作为JVM完全关闭自身之前的中间步骤,因此它可能不是您要注意的。

您需要使用SignalHandlersun.misc.SignalHandler)截获SIGINTCtrl+触发的信号C(在Unix和Windows上)。
请参阅本文(pdf,第8和9页)。


5
@MartijnCourteaux发生在五年后;)我在该主题上找到了类似的消息来源,并相应地更改了链接。
VonC

@VonC-又死了
Gurwinder Singh

@GurV哪个链接?我在2014年4月(由编辑stackoverflow.com/revisions/...)仍然有效:你仍然可以下载PDF文件..
VonC


8

为了能够在不因某种原因而关闭的情况下处理Ctrl+ C,您需要使用某种形式的信号处理(因为Ctrl+C输入实际上并未直接传递给您的应用程序,而是由生成该文件的OS处理SIGINT,然后将其传递给Java。

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

(如果您只是想正常关机,则akf的答案就足够了。)


4

有关如何处理SIGTERM的一些链接-这是程序进入OS端的信号:

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兼容,但是不同版本可能会有很多差异。


1
第二个链接失败。是否已通过oracle.com/technetwork/java/javase/tsg-vm-149989.pdf更改为Oracle ?
机会

第三个链接也失败了
Hugo Zaragoza
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.