【问题标题】:Not receiving the Native SIGIO signals in serial port calling from Java thread在从 Java 线程调用的串行端口中未接收到本机 SIGIO 信号
【发布时间】:2018-08-18 06:47:24
【问题描述】:

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

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

基于 flag_values,读取、解析数组并将其发送回 Java。我在 C 中使用来自 main 的 pthread 调用接收函数,它工作正常。但是从 Java 开始,我被困在了第一步本身。在一段时间 IO 信号未到达之后,我没有正确接收 IO 信号。在 Native C 中,每当 IO 信号到达时,它都会在单独的进程中启用标志。为此,我必须在 Signal IOhandler 中添加任何其他内容吗?

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

【问题讨论】:

  • 提供你的代码,让我们看看。
  • 您在 Stack Overflow 上提出的两个问题表明您的期望需要稍作改变。您的读者通常是这里的志愿者,他们是在空闲时间来这里的。因此,列出任何对答案的要求以及您需要答案的时间范围并不理想。

标签: java c serial-port java-native-interface signals


【解决方案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 是否已触发,您可以使用 straceauditd (https://www.ibm.com/developerworks/community/blogs/aimsupport/entry/Finding_the_source_of_signals_on_Linux_with_strace_auditd_or_Systemtap?lang=en)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多