【问题标题】:Java: Possible to disable Ctrl-C in Java console application?Java:可以在 Java 控制台应用程序中禁用 Ctrl-C 吗?
【发布时间】:2012-03-14 16:17:31
【问题描述】:

正如题主所说,有没有办法禁用 CTRL-C(和其他信号),这样它们就不会终止应用程序?

【问题讨论】:

  • 您可以禁用某些信号,但不能全部禁用,例如kill -9 ;)
  • @Johan 那篇文章解释了我遇到的一些困难。更具体地说,JVM 在终止之前拦截了信号调用关闭挂钩(通过 Runtime.addShutdownHook 注册)。然而,它似乎没有描述如何/是否可以禁用信号(或至少阻止它们终止应用程序)。

标签: java


【解决方案1】:

EDIT2:这也可能有帮助:Capture SIGINT in Java

Thisthis 似乎是您想要的。

Ctrl-C 和其他命令向您的程序发送“信号”,如果您编写代码来“捕捉”这些信号,您可以更改程序的反应方式。理想情况下,您希望 ctrl-c 终止程序,因为这是用户所期望的,因此请记住,如果您更改程序的响应,您应该告诉用户为什么它没有终止。

Edit3:如果您自己无法捕捉和关闭该事件,Cat 建议的 keylistener 是您的下一个最佳选择。 Halway down the page is an example of how to do it for java in linux/Windows - it's not a portable thing. 本质上,您的程序将处理键盘事件,而不是控制台向其发送键盘事件。这意味着命令行被绕过,并且无法读取 ctrl-c 调用。我会写代码,但我现在在工作;星期三对我来说是漫长的一天。如果到我回家的时候你还没有得到它,我会看看写一些例子。

【讨论】:

  • 感谢您的帮助,但是这些链接涉及设置关闭挂钩,JVM 在终止应用程序之前调用该挂钩。应用程序仍然被终止,这是我试图阻止的。
  • 试试我刚刚添加的 IBM。对不起,我在上课;我出去后可以仔细看看,但这似乎是最好的文章。
  • 引用的 IBM 文章页面说不能显示 - 404 :(
  • @Mike - 感谢您的提醒!我已将其删除,因为我认为它不是必需的,而且我在他们的网站上找不到相应的文章。
【解决方案2】:

您需要使用 SignalHandler 来拦截由 CTRL-C 触发的 SIGINT 信号。假设您不希望 VM 接收信号,则 CTRL-C 将在操作系统级别处理。

IBM DeveloperWorks 有一篇关于这样做的文章 - http://www.ibm.com/developerworks/ibm/library/i-signalhandling/?open&l=409,t=grj,p=jsh

Oracle 链接 - http://www.oracle.com/technetwork/java/javase/signals-139944.html

【讨论】:

  • 这些链接似乎都不起作用,这很可惜——它们听起来真的很有用。我刚刚遇到ringlord.com/dl/Signals-in-Java.pdf,它可能与您所指的内容相同,也可能不同。使用私有 Sun API 调用。
【解决方案3】:

我假设如果您启动 KeyListener 来处理按下 ctrl+C 的事件,它应该否定“自然”响应或调用您设计的子例程。

【讨论】:

  • 假设不是答案。这应该是一条评论。
猜你喜欢
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-07
  • 2012-03-17
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多