我正在研究我正在研究的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 storm"?
-
有没有办法控制SIGIO筹集政策?
提前致谢 .
再见 .
(*):实际上我正在关注this C++ FAQ Lite hint所以信号处理程序调用一个对象的成员函数来封装我所有的串行处理内容 . 不幸的是,即使我在信号处理程序本身中调用read(),问题仍然会发生 .
1 回答
你在信号处理程序中调用
read
?这是不好的 . 很少有功能async-signal safe . SIGIO风暴可能是由读取递归发送SIGIO引起的 . 您的信号处理程序应该只设置一个标志并立即返回 .