在Java线程的串口调用中没有收到Native SIGIO信号

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Java线程的串口调用中没有收到Native SIGIO信号相关的知识,希望对你有一定的参考价值。

我需要在Linux平台下为患者监护仪子系统创建一个JNI c库。我必须读取数据并通过USB串口写入命令。只要端口打开,设备就会以不同的频率和大小连续发送多种类型的数据。

从Java开始,我正在运行一个调用本机jni c代码的独立线程,在那里我调用一个C函数来从基于RX_Flag的while(1)循环中的串口读取数据,该函数在信号处理程序中被启用。在端口配置期间,信号处理函数使用sigaction与SIGIO连接。我的期望是,每当数据到达端口时,触发信号,该信号连接到signalIO处理程序,启用RX_Flag。

基于flag_values,读取,解析并将数组发送回Java。我在C中使用来自main的pthread来调用receive函数,它运行正常。但是从Java开始,我就陷入了第一步。在某些时间IO信号未到达之后,我没有正确接收IO信号。在Native C中,只要IO信号到达,它就会在单独的进程中启用该标志。为此,我需要在Signal IOhandler中添加任何其他内容吗?

我是以正确的方式进行还是有其他方法来实现这一点?

答案

JVM将信号用于自己的目的,这在此线程Cannot catch SIGINT signal in a producer-consumer program where JNI is used in consumer thread中进行了总结。有一种叫java信号链的技术来处理这个......

引入信号链设施是为了解决以前版本的Java HotSpot VM中的信号处理问题。在版本1.4之前,Java HotSpot VM不允许应用程序安装的信号处理程序用于某些信号,包括例如SIGBUS,SIGSEGV,SIGILL等,因为这些信号处理程序可能与Java HotSpot VM内部使用的信号处理程序冲突。

来源:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/signal-chaining.html

如果具有本机代码的应用程序需要自己的信号处理程序,则可能需要将其与信号链接工具一起使用

来源:https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/signals003.html

SIGIO被当前的JVM使用:https://github.com/JetBrains/jdk8u_hotspot/blob/master/src/os/linux/vm/jvm_linux.cpp

要验证SIGIO是否被触发,您可以使用straceauditdhttps://www.ibm.com/developerworks/community/blogs/aimsupport/entry/Finding_the_source_of_signals_on_Linux_with_strace_auditd_or_Systemtap?lang=en

以上是关于在Java线程的串口调用中没有收到Native SIGIO信号的主要内容,如果未能解决你的问题,请参考以下文章

在java层用线程调用native方法 jni能回调主线程的方法吗?

Android jni 线程同步

Android jni 线程同步

运行时数据区

求串口读示例

JNI——Android Native中跨线程使用JNI的问题