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

时间:2010-01-11 08:38:27

标签: linux asynchronous serial-port signals

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

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

我从Linux Serial Programming HowTo跟随this async-communication example,它运行得很完美。

然后我删除了“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风暴”?
  • 有没有办法控制SIGIO筹集政策?

提前致谢。

再见。

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

1 个答案:

答案 0 :(得分:4)

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