当使用sun.misc.Signal
和sun.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
是正确的方法。
答案 0 :(得分:0)
如related question中所述,您应 在SignalHandler.SIG_DFL
中<{1}}致电,因为您会导致SignalHandler
。事实上,JVM也不使用SEGV
(SIG_DFL
,INT
和TERM
。)
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
}
});