首页 > 解决方案 > JVM 在接收到 POSIX 信号时终止

问题描述

我有一个使用 JNA 库从 Java 加载的本机 C 库。该本地 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 如何提供“信号链”的文档,并尝试在使用 export LD_PRELOAD="...\libjsig.so "设置 libjsig.so 后启动 java 应用程序,但未能防止应用程序终止。

3) 根据我的阅读,JVM 似乎没有将 SIGRTMIN + 3 用于其内部目的,但在如何建议 JVM 仅链接 SIGRTMIN 而不是链接的方式上似乎没有太多文档只是终止。

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

标签: jvmsignalsposix

解决方案


推荐阅读