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

问题描述 投票:1回答:1

我需要在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中添加任何其他内容吗?

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

java c serial-port java-native-interface signals
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.