无法在消费者线程中使用 JNI 的生产者-消费者程序中捕获 SIGINT 信号
Posted
技术标签:
【中文标题】无法在消费者线程中使用 JNI 的生产者-消费者程序中捕获 SIGINT 信号【英文标题】:Cannot catch SIGINT signal in a producer-consumer program where JNI is used in consumer thread 【发布时间】:2015-10-29 15:57:17 【问题描述】:我正在为生产者-消费者问题编写程序。
生产者生产数据并将数据推送到boost::spsc_queue
,消费者对其进行处理。
在消费者线程中,我使用JNI
从我用 c++ 编写的代码中调用一些 java 函数。
我是 initializing and creating JVM
在消费者线程调用的函数中,然后事件循环开始,它从 boost::spsc_queue
弹出数据并处理它。
现在,我想捕捉SIGINT
信号,所以我写了一个signal_handler
并将它注册到我的main()
函数中。但它不起作用。
如果我注释掉所有 JNI 内容并在消费者线程调用的函数中启动循环 while(1)
,那么它正在捕获 SIGINT 并按预期工作。
我还需要处理 JVM 或 JNI 的东西吗? 在主线程中初始化和创建 JVM 后,我应该尝试同样的事情吗?有意义吗?
【问题讨论】:
【参考方案1】:看来,你需要-Xrs
option
-Xrs
减少 JVM 对操作系统信号的使用。
…
嵌入 JVM 的应用程序经常需要捕获
SIGINT
或SIGTERM
等信号,这可能会导致干扰 JVM 信号处理程序。-Xrs
选项可用于解决此问题。使用-Xrs
时,JVM 不会更改SIGINT
、SIGTERM
、SIGHUP
和SIGQUIT
的信号掩码,并且不会安装这些信号的信号处理程序。指定
-Xrs
有两种后果:
SIGQUIT
线程转储不可用。用户代码负责导致关闭挂钩运行,例如,当 JVM 被终止时调用
System.exit()
。
您可以在传递给JNI_CreateJavaVM(…)
的JavaVMInitArgs
中指定此类选项。
【讨论】:
【参考方案2】:是的,JVM 出于自己的目的使用信号处理程序,这就是为什么您需要特别关注信号链的原因。 Read more >
【讨论】:
以上是关于无法在消费者线程中使用 JNI 的生产者-消费者程序中捕获 SIGINT 信号的主要内容,如果未能解决你的问题,请参考以下文章