如何解决C ++-当JVM捕获SIGCHLD?时,QProcess卡在waitForFinished上
我有一个C ++ qt应用程序,该应用程序很少通过QProcess进行进程外调用。我正在尝试通过JNI(从https://stackoverflow.com/a/992876/3505471复制,除了添加类路径以外没有其他任何更改)来调用Java类。
JNI调用工作正常。但是,对env->CallStaticVoidMethod()
的调用之后的所有QProcess调用都将停留在qprocess->waitForFinished()
上。 qprocess似乎已经完成了任务(我从输出日志中推断出该任务),但是我认为它无法通知父进程它已经完成。
进一步挖掘,我发现应该在子进程退出时将SIGCHLD
发送到父进程。我还发现JVM还使用信号进行通信(我对JNI和信号处理还很陌生),并且可能捕获了SIGCHLD(?)
如何配置JVM使其不干扰这些信号,或者是否有更好的共存方式?如果您能帮助我了解幕后发生的事情,我也将不胜感激。 JVM中发出信号。
回想起来,我发现了一些日志,这些日志在开始时被我愚蠢地忽略了,可能是这个难题中的重要一环。
Warning: SIGPIPE handler expected:libjvm.dylib+0x5fbe5c found:0x0000000000000001
Signal Handlers:
SIGSEGV: [libjvm.dylib+0x5fbe5c],sa_mask[0]=11111111011111110111111111111111,sa_flags=SA_ONSTACK|SA_RESTART|SA_SIGINFO
SIGBUS: [libjvm.dylib+0x5fbe5c],sa_flags=SA_RESTART|SA_SIGINFO
SIGFPE: [libjvm.dylib+0x5fbe5c],sa_flags=SA_RESTART|SA_SIGINFO
SIGPIPE: SIG_IGN,sa_mask[0]=00000000000000000000000000000000,sa_flags=none
SIGXFSZ: [libjvm.dylib+0x5fbe5c],sa_flags=SA_RESTART|SA_SIGINFO
SIGILL: [libjvm.dylib+0x5fbe5c],sa_flags=SA_RESTART|SA_SIGINFO
SIGUSR2: [libjvm.dylib+0x5fc45a],sa_flags=SA_RESTART|SA_SIGINFO
SIGHUP: SIG_DFL,sa_flags=none
SIGINT: SIG_DFL,sa_flags=none
SIGTERM: SIG_DFL,sa_flags=none
SIGQUIT: SIG_DFL,sa_flags=none
更多上下文:我将需要JVM在应用程序的整个生命周期中存在(初始化一次,并在需要时调用方法以提高性能),因此我将它作为单例的成员类。在JNI调用之前和之后,我必须进行进程外调用。我必须在Mac和Windows上使它正常工作(当前在Mac上进行测试)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。