【问题标题】:Signal handling using "TERM"使用“TERM”处理信号
【发布时间】:2009-09-11 05:40:25
【问题描述】:

我有一个独立的应用程序,当用户尝试通过start-->shutdown 关闭系统时,我必须通过确认对话框提示用户保存他所做的更改。

我知道通过使用signalhandlers 我们可以做到。
有人可以帮我如何使用信号处理程序

【问题讨论】:

标签: java signals


【解决方案1】:

2012 年 5 月更新(两年半后)

Trejkazcmets:

在当前版本的 Java 中,此信号处理代码失败,因为“INT”信号“由 VM 或操作系统保留”。
此外,当请求关闭应用程序时,其他有效信号名称都不会真正触发(我只是煞费苦心地测试了所有我能找到的信号名称......)
关闭钩子大部分工作,但我们发现在我们的例子中它没有触发,所以下一步显然是求助于在 JVM 背后注册一个处理程序

Troubleshooting Guide for HotSpot VM”的“Integrating Signal and Exception Handling”一章提到信号“SIGTERMSIGINTSIGHUP”仅适用于 Solaris OS 和 Linux。
仅提及 Windows 上的异常处理。


原始答案(2009 年 9 月)

ShutdownHook 应该能够处理这种情况

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
    public void run() {
        // what you want to do
    }
}));

(与caveats
另见:

作为简单信号处理的说明:

public class Aaarggh {
  public static void main(String[] args) throws Exception {
    Signal.handle(new Signal("INT"), new SignalHandler () {
      public void handle(Signal sig) {
        System.out.println(
          "Aaarggh, a user is trying to interrupt me!!");
        System.out.println(
          "(throw garlic at user, say `shoo, go away')");
      }
    });
    for(int i=0; i<100; i++) {
      Thread.sleep(1000);
      System.out.print('.');
    }
  }
}

【讨论】:

  • 酷 - 但这依赖于 sun.misc.* 树,现在已弃用。并提示我们应该使用什么当前类?
  • @zigdon:实际上不确定。这些类仍然存在于 jdk 或 openjdk 中,docjar.com/docs/api/sun/misc/SignalHandler.html,即使它们不是受支持的公共接口 (oracle.com/technetwork/java/faq-sun-packages-142232.html) 的一部分,但其他解决方案可能涉及 JVMTI 或 JMX (stackoverflow.com/questions/5023520/…)
  • 在当前版本的 Java 中,此信号处理代码失败,因为“INT”信号“由 VM 或操作系统保留”。此外,当某些东西请求应用程序关闭时,其他有效信号名称实际上都不会触发(我只是煞费苦心地测试了所有我能找到的信号名称......)关闭挂钩大部分都有效,但我们发现在我们的例子中它不是'没有触发,所以下一步显然是诉诸在 JVM 背后注册一个处理程序。 :)
  • @Trejkaz 当前版本:Java7,我想?我在答案中包含了您的评论以及一些附加链接。
  • 我知道我不应该,但大蒜串 +1。这让我笑了。
猜你喜欢
  • 2012-10-30
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 2017-08-29
  • 1970-01-01
相关资源
最近更新 更多