我定义自己的处理程序时应该触发默认信号处理程序吗?

时间:2015-08-17 19:12:24

标签: java signals

当使用sun.misc.Signalsun.misc.SignalHandler类将SIGINT发送到我的Java应用程序时,我尝试进行一些预关闭清理。

当我注册我的处理程序时,不再出现默认行为。但是有一个SignalHandler.SIG_DFL字段包含"默认信号处理程序"。首先,是否记录了默认处理程序的行为?其次,在实现自己的处理程序时,我是否更喜欢以下模式?

SignalHandler handler = new SignalHandler() {
    public void handle(Signal sig) {
      ... // handle SIGINT
      SignalHandler.SIG_DFL.handle(sig);
    }
};

编辑:我知道sun.misc包不可移植,并且关闭挂钩是处理应用程序终止的更强大的方法。我只想说我知道这些功能,并且需要直接处理信号。据我所知,sun.misc.Signal是正确的方法。

2 个答案:

答案 0 :(得分:0)

related question中所述,您应 SignalHandler.SIG_DFL中<{1}}致电,因为您会导致SignalHandler。事实上,JVM也不使用SEGVSIG_DFLINTTERM。)

Under the covers所有Java在收到任何这些信号时都会调用HUP。因此,如果要复制默认行为,只需自己调用System.exit()即可。显然,如果您不想退出以响应信号,则根本不需要调用旧的/默认信号处理程序。

警告:这是未记录的行为。不太可能,但未来的Java版本可能会改变这种行为。

答案 1 :(得分:-1)

回答你的问题:不,你不需要(或想要)调用默认处理程序。但是使用这个类是不可移植的。 你应该安装shutdown hook:

Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
        //your graceful shutdown procedure here
    }
});