我怎么可以"拦截"按Ctrl+C CLI应用程序?
-
06-07-2019 - |
题
我怎么可以 拦截 Ctrl+C (通常会杀死的过程) 在CLI(命令线路接口)Java应用程序?
不会的多平台方案存在(Linux,Solaris、视窗)?
我在使用 Console
's readLine()
, 但如果有必要,我可以使用一些其他的方法
阅读字从标准输入。
解决方案
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() { /*
my shutdown code here
*/ }
});
这应该能够拦截信号,但只是作为一个中间步骤之前JVM完全关闭自己,因此它不可能是你在找什么之后。
你需要使用一个 SignalHandler
(sun.misc.SignalHandler
)截取的 SIGINT
触发的信号 Ctrl+C (Unix以及在Windows)。
看看 这篇文章 (pdf,page8和9)。
其他提示
我假设您要优雅地关闭,而不是将关机过程短路。如果我的假设是正确的,那么你应该看看关机挂钩。
为了能够处理 Ctrl + C 而不关闭由于某种原因,你需要使用某种形式的信号处理(因为 Ctrl + C 输入实际上并未直接传递给您的应用程序,而是由生成SIGINT然后传递给Java的操作系统处理。
请参阅 http://www.oracle.com/technetwork/有关信号处理的详细信息,请参阅java / javase / signals-139944.html 。
(如果你只是想要优雅地关闭,akf的答案就足够了。)
有关如何处理SIGTERM的一些链接 - 这是程序在操作系统端获得的信号:
http://blog.webinf.info/2008/08/intercepting -sigterm.html
http://java.sun的.com / JavaSE的/ 6 / webnotes /麻烦/ TSG-VM / HTML / signals.html
http://www.ibm.com/developerworks/java/库/ I-signalhandling /
这应该适用于POSIX操作系统 - 也就是说,Mac和Unix应该可以工作,在Windows上我不确定,我记得听说它在某种程度上也兼容POSIX,但可能会因不同的版本而大量出现。 / p>