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

dim*_*414 5 java signals

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

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

SignalHandler handler = new SignalHandler() {
    public void handle(Signal sig) {
      ... // handle SIGINT
      SignalHandler.SIG_DFL.handle(sig);
    }
};
Run Code Online (Sandbox Code Playgroud)

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

dim*_*414 0

正如相关问题中所详述的,您不应该调用SignalHandler.SIG_DFLSignalHandler,因为您会导致SEGV. 事实上,JVMSIG_DFL两者都不使用(例如INTTERMHUP)。

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

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