在工作中,我被要求在Linux上使用C ++实现工业硬件的新控制器应用程序。一个关键特性是使用modbus在设备之间使用无线调制解调器通信。我可以很好地读取和写入串口ttyS0的数据,但我正在使用SIGIO信号的信号处理程序告诉主控制循环数据何时到达端口进行读取。时间是至关重要的,因为协议将传输结束定义为我需要检测的3.5个字符长度。我在网上看到,使用SIGIO处理程序并不是一个好主意(包括这个here on stackoverflow的答案)。谁能告诉我为什么这种做法不受欢迎?我的偏好是使用poll()
或select()
在新线程上运行传入消息监视,但我的老板热衷于信号处理程序方法,但我们都是Linux的新手,所以任何解释都会感激不尽。
答案 0 :(得分:1)
信号处理程序增加了大量复杂性和与重入和原子性相关的错误风险。您可以在此处查看讨论文章: http://www.ibm.com/developerworks/linux/library/l-reent/index.html
听起来你没有充分的理由为你的用例使用信号处理程序。如果您的信号处理程序只是要发信号通知另一个线程进行读取,为什么不使用阻塞读取或从该其他线程中选择?