【问题标题】:Cannot catch SIGINT signal in a producer-consumer program where JNI is used in consumer thread无法在消费者线程中使用 JNI 的生产者-消费者程序中捕获 SIGINT 信号
【发布时间】: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 后,我应该尝试同样的事情吗?有意义吗?

【问题讨论】:

    标签: java c++ multithreading boost jvm


    【解决方案1】:

    看来,你需要-Xrs option

    -Xrs

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

    嵌入 JVM 的应用程序经常需要捕获 SIGINTSIGTERM 等信号,这可能会导致干扰 JVM 信号处理程序。 -Xrs 选项可用于解决此问题。使用-Xrs 时,JVM 不会更改SIGINTSIGTERMSIGHUPSIGQUIT 的信号掩码,并且不会安装这些信号的信号处理程序。

    指定-Xrs有两种后果:

    • SIGQUIT 线程转储不可用。

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

    您可以在传递给JNI_CreateJavaVM(…)JavaVMInitArgs 中指定此类选项。

    【讨论】:

      【解决方案2】:

      是的,JVM 出于自己的目的使用信号处理程序,这就是为什么您需要特别关注信号链的原因。 Read more >

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-18
        • 2013-11-10
        • 1970-01-01
        • 1970-01-01
        • 2018-09-24
        • 2017-02-01
        • 2012-04-30
        • 1970-01-01
        相关资源
        最近更新 更多