在消费者线程中使用 JNI 的生产者-消费者程序中无法捕获 SIGINT 信号

2024-03-28

我正在为生产者消费者问题编写一个程序。

生产者生产数据并将数据推送到boost::spsc_queue消费者处理它。

在消费者线程中,我正在使用JNI从我用 c++ 编写的代码中调用一些 java 函数。

I am initializing and creating JVM在消费者线程调用的函数本身中,然后事件循环开始,从中弹出数据boost::spsc_queue并处理它。

现在,我想抓住SIGINT信号,所以我写了一个signal_handler并将其注册到我的main()功能。但它不起作用。

如果我注释掉所有 JNI 内容并开始一个循环while(1){}在消费者线程调用的函数中,它正在捕获 SIGINT 并按预期工作。

对于 JVM 或 JNI 的东西,我还需要注意什么吗? 在主线程中初始化并创建 JVM 后我应该尝试同样的事情吗?是否有意义?


看来,你需要-Xrs option http://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BABHDABI

-Xrs

减少 JVM 对操作系统信号的使用。

嵌入 JVM 的应用程序经常需要捕获信号,例如SIGINT or SIGTERM,这可能会导致对 JVM 信号处理程序的干扰。这-Xrs选项可以解决这个问题。什么时候-Xrs使用时,信号掩码为SIGINT, SIGTERM, SIGHUP, and SIGQUITJVM 不会更改,并且不会安装这些信号的信号处理程序。

指定有两个后果-Xrs:

  • SIGQUIT线程转储不可用。

  • 用户代码负责导致关闭挂钩运行,例如,通过调用System.exit()当 JVM 将被终止时。

您可以在JavaVMInitArgs你传递给的JNI_CreateJavaVM(…) https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/invocation.html#overview.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在消费者线程中使用 JNI 的生产者-消费者程序中无法捕获 SIGINT 信号 的相关文章

随机推荐