Java:Java控制台应用程序中是否可以禁用Ctrl-C?

8
正如主题所述,有没有一种方法可以禁用CTRL-C(和其他信号),使它们不终止应用程序?

2
你可以禁用一些信号,但不能禁用所有信号,比如 kill -9 ;) - Peter Lawrey
@Johan,那篇文章解释了我遇到的一些困难。更具体地说,似乎JVM在终止之前会拦截信号调用关闭挂钩(通过Runtime.addShutdownHook注册)。然而,它似乎没有描述如何/是否可能禁用信号(或者至少防止它们终止应用程序)。 - Jin Kim
3个回答

6

编辑2: 这也许可以帮到你: 在Java中捕获SIGINT信号

这个这个 看起来是你想要的。

Ctrl-C和其他命令向你的程序发送"信号",如果你编写代码来"捕获"这些信号,你就可以改变你的程序如何响应。理想情况下,你会希望ctrl-c终止程序,因为这是用户所期望的,所以请记住,如果你改变了程序的响应,你应该告诉用户为什么它没有终止。

编辑3: 如果你无法自己捕获和解除事件,那么Cat的建议是你的下一个最佳选择。页面中间有一个在linux/Windows中如何做的例子 - 它不是可移植的。 基本上,你的程序将处理键盘事件,而不是控制台将键盘事件发送给它。这意味着命令行被绕过,不能读取ctrl-c调用。我会写代码,但我现在在工作中;周三对我来说是漫长的一天。如果你到我回家之前还没有搞定,我会考虑写一些例子。


谢谢您的帮助,不过那些链接是关于设置关闭钩子的,这些钩子会在 JVM 终止应用程序之前调用。应用程序仍然会被终止,而我要防止的正是这种情况。 - Jin Kim
请尝试我刚刚添加的IBM文章。抱歉,我正在上课;等我下课后再仔细看看,但那似乎是最好的文章。 - Marshall Conover
1
IBM的相关文章页面显示不出来了,404错误 :( - Mike
@Mike - 谢谢你提醒我!我已经将它删除了,因为我认为它并不是必要的,并且我在他们的网站上找不到相应的文章。 - Marshall Conover

2

这两个链接似乎都无法使用,这真是遗憾——它们听起来非常有用。我刚刚发现了http://ringlord.com/dl/Signals-in-Java.pdf,可能与您所提到的内容相同,但使用了私有的Sun API调用。 - Bill K

2

如果您启动一个KeyListener来处理按下ctrl+C的事件,我认为它应该要么否定“自然”响应,要么调用您设计的子程序。


2
假设不等于答案。这应该是一条注释。 - Alain O'Dea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接