java – 如何触发默认信号处理行为?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 如何触发默认信号处理行为?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2280字,纯文字阅读大概需要4分钟。
内容图文
![java – 如何触发默认信号处理行为?](/upload/InfoBanner/zyjiaocheng/819/abc15052768246ed956a5f3baed8aae9.jpg)
在我的Java应用程序中,我想捕获SIGINT,进行一些预处理,然后让默认行为(进程终止)运行.我想我可以这样做:
Signal.handle(new Signal("INT"), new SignalHandler() {
@Override
public void handle(Signal signal) {
// preprocessing
// ...
// now do default behavior
SignalHandler.SIG_DFL.handle(signal);
}
});
但是当我发送SIGINT到这个应用程序时,我得到一个SEGV:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x0000000000000000, pid=10261, tid=21507
#
# JRE version: Java(TM) SE Runtime Environment (8.0_51-b16) (build 1.8.0_51-b16)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.51-b03 mixed mode bsd-amd64 compressed oops)
# Problematic frame:
# C 0x0000000000000000
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /private/tmp/hs_err_pid10261.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
Abort trap: 6
看来SignalHandler.SIG_DFL似乎不是直接调用的(即使是来自其他信号处理代码).那我怎么能手动触发呢?
或者,我如何手动复制SIG_DFL的行为?它似乎相当于:
System.exit(signal.getNumber() + 128)
但我没有看到任何相关文件.
另一种表达我的问题的方法:
实际上*这两个代码块之间有区别吗?
一个)
Signal.handle(new Signal("INT"), SignalHandler.SIG_DFL);
B)
Signal.handle(new Signal("INT"), new SignalHandler() {
@Override
public void handle(Signal signal) {
System.exit(signal.getNumber() + 128)
}});
*我知道未记录的行为可能随时发生变化,但JVM的退出行为不太可能在版本中期发生变化.在实践中,简单地解释现在发生的事情的答案是可以接受的.
解决方法:
我认为这里的关键是SIG_DFL不是SIGINT的原始处理程序.
以下代码对我有用:
Signal sigInt = new Signal("INT");
// First register with SIG_DFL, just to get the old handler.
final SignalHandler oldHandler = Signal.handle(sigInt, SignalHandler.SIG_DFL );
// Now register the actual handler
Signal.handle(sigInt, new SignalHandler(){
@Override
public void handle(Signal signal) {
System.err.println("Sigint is being handled");
oldHandler.handle(signal);
}
});
这不会导致分段违规,而是按预期终止程序(在打印示例文本之后).
内容总结
以上是互联网集市为您收集整理的java – 如何触发默认信号处理行为?全部内容,希望文章能够帮你解决java – 如何触发默认信号处理行为?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。