gpt4 book ai didi

Linux:多重 SIGIO 问题(异步串行通信)

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:23 28 4
gpt4 key购买 nike

我正在处理的 C++ 程序中遇到与 SIGIO 相关的问题。

  • 平台:Linux 2.6.30,x86 Arch
  • 场景:异步串行通信。

我关注了this async-communication example来自 Linux Serial Programming HowTo,它工作得很好。

然后我删除了“sleep+check wait_flag”,现在我直接在 signal_handler_IO() 中处理 read() 部分。也就是说,当某些输入可用时,将调用信号处理程序并强制读取串行端口 (*)。

我的代码似乎可以工作,但不幸的是,当新输入可用时,SIGIO 信号会多次发出,因此我得到了虚假/不完整的读取(每个 SIGIO 接收到都会强制读取)。

我改变了VMIN and VTIME用于控制读取缓冲区的串行选项(即 VMIN=255/VTIME=15,VMIN=50/VTIME=0,...)。我尝试设置 SA_SIGINFO 标志(如某些人所建议的),但没有成功。

所以:

  • 关于 SIGIO 筹集/处理我错过了什么?
  • 有没有办法避免这种“SIGIO Storm ”?
  • 有什么办法可以控制 SIGIO 募集政策吗?

提前致谢。

再见。

(*):其实我在关注this C++ FAQ Lite hint所以信号处理程序调用一个对象的成员函数,该对象封装了我所有的串行处理内容。不幸的是,即使我在信号处理程序本身中调用 read(),问题仍然存在。

最佳答案

您在信号处理程序中调用 read 吗?这不好。很少有功能是async-signal safe . SIGIO Storm 可能是由读取递归发送 SIGIO 引起的。您的信号处理程序应该只设置一个标志并立即返回。

关于Linux:多重 SIGIO 问题(异步串行通信),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2040663/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com