JVM在接收到POSIX信号时终止

JVM在接收到POSIX信号时终止,jvm,signals,posix,Jvm,Signals,Posix,我有一个本机C库,我使用JNA库从Java加载它。本机C库在引擎盖下使用了一些POSIX信号处理器,它响应SIGRTMIN+3,可能还有其他SIGRTMIN+x 当我在Linux(64位Ubuntu)中从终端运行java程序时,程序终止,在shell屏幕上我看到文本“实时信号3”。这个库似乎向它自己的进程发送了一个信号SIGRTMIN+3,但它似乎终止了JVM 我可以看到这种情况,因为我认为在没有相关处理程序的情况下接收SIGRTMIN+x的应用程序的默认配置应该终止该应用程序。然而,在本例中,

我有一个本机C库,我使用JNA库从Java加载它。本机C库在引擎盖下使用了一些POSIX信号处理器,它响应SIGRTMIN+3,可能还有其他SIGRTMIN+x

当我在Linux(64位Ubuntu)中从终端运行java程序时,程序终止,在shell屏幕上我看到文本“实时信号3”。这个库似乎向它自己的进程发送了一个信号SIGRTMIN+3,但它似乎终止了JVM

我可以看到这种情况,因为我认为在没有相关处理程序的情况下接收SIGRTMIN+x的应用程序的默认配置应该终止该应用程序。然而,在本例中,库希望处理该信号,但JVM似乎在接收到该信号时终止

1) 我已经编写了一个快速而肮脏的应用程序,在从shell启动应用程序之后,它只向进程发送SIGRTMIN+3(和其他SIGRTMIN+x),并确认它确实终止了java应用程序

2) 我已经阅读了大量关于java如何提供“信号链接”的文档,并尝试在设置libjsig.so后使用export LD_PRELOAD=“…\libjsig.so”启动java应用程序,但未能阻止应用程序终止

3) 从我所读到的内容来看,JVM似乎并没有将SIGRTMIN+3用于其内部目的,但在如何建议JVM只链接SIGRTMIN而不只是终止方面,似乎没有太多的文档


有没有一种方法可以指示JVM不要终止并允许本机库处理该信号?

因为您没有告诉您正在使用的JVM,也没有提供测试代码,所以很难说什么是错误的。同时,HotSpot JVM对
SIGRTMIN+n
信号没有做任何特殊的处理。也就是说,本机库可以完美地设置自己的信号处理程序并防止进程终止。这是一个。你真的为信号注册了一个
sigaction
吗?很抱歉没有发布代码,因为我还没有制作它的分条版本。SMH。所以,谢谢你问了一个明显的问题“你注册了SIGATION吗?”。。结果表明,代码使用sigtimedwait等待信号。当我进入代码并做了一些肮脏的事情并为SIGRTMIN+3注册了一个虚拟处理程序时,代码确实执行了该处理程序。。。因此,JVM似乎只链接信号处理程序,而不识别SIGMetimed wait。有什么建议吗?正如所说,在多线程程序中,应该在所有线程中阻止信号,以防止信号在调用
sigwaitinfo()
sigtimedwait()
的线程以外的线程中按照其默认配置进行处理。显然,你的图书馆没有这样做。同样,JVM对这些信号没有什么特别的作用——它的行为就像任何其他多线程进程一样。由您自行安装信号处理程序或使用
sigprocmask
阻止信号。由于您没有告诉您使用的是什么JVM,也没有提供测试代码,因此很难说什么是错误的。同时,HotSpot JVM对
SIGRTMIN+n
信号没有做任何特殊的处理。也就是说,本机库可以完美地设置自己的信号处理程序并防止进程终止。这是一个。你真的为信号注册了一个
sigaction
吗?很抱歉没有发布代码,因为我还没有制作它的分条版本。SMH。所以,谢谢你问了一个明显的问题“你注册了SIGATION吗?”。。结果表明,代码使用sigtimedwait等待信号。当我进入代码并做了一些肮脏的事情并为SIGRTMIN+3注册了一个虚拟处理程序时,代码确实执行了该处理程序。。。因此,JVM似乎只链接信号处理程序,而不识别SIGMetimed wait。有什么建议吗?正如所说,在多线程程序中,应该在所有线程中阻止信号,以防止信号在调用
sigwaitinfo()
sigtimedwait()
的线程以外的线程中按照其默认配置进行处理。显然,你的图书馆没有这样做。同样,JVM对这些信号没有什么特别的作用——它的行为就像任何其他多线程进程一样。由您自行安装信号处理程序或使用
sigprocmask
阻止信号。