c++ - Linux 上的串行端口通信 - 为什么使用 SIGIO 处理程序不好?

标签 c++ linux serial-port

在工作中,有人要求我在 Linux 上使用 C++ 为工业硬件实现一个新的 Controller 应用程序。一个关键特性是在使用 modbus 的设备之间使用 radio 调制解调器通信。我能够很好地读取和写入串行端口 ttyS0 的数据,但是我正在使用 SIGIO 信号的信号处理程序来通知主控制循环数据何时到达端口以供读取。时间是至关重要的,因为协议(protocol)将传输结束定义为我需要检测的 3.5 个字符长度。我在网上看到,为此目的使用 SIGIO 处理程序并不是一个好主意(包括对此 here on stackoverflow 的回答)。谁能告诉我为什么这种方法不受欢迎?我的偏好是使用 poll()select() 在新线程上运行传入消息监视,但我的老板热衷于信号处理程序方法,但我们都是Linux 的新手,所以任何解释都将不胜感激。

最佳答案

信号处理程序增加了与重入性和原子性相关的大量复杂性和错误风险。您可以在此处查看讨论文章: http://www.ibm.com/developerworks/linux/library/l-reent/index.html

听起来您没有充分的理由为您的用例使用信号处理程序。如果您的信号处理程序只是向另一个线程发送信号以进行读取,为什么不使用阻塞读取或从另一个线程中选择?

关于c++ - Linux 上的串行端口通信 - 为什么使用 SIGIO 处理程序不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10777768/

相关文章:

c++ - 使用正则表达式验证输入

c++ - 在 SDL 中,当我在屏幕上绘制菜单时,它会使游戏变慢并且无法运行我该如何解决这个问题?

php - 电子邮件在 Joomla 网站 [SMTP] 中不起作用

在内核中调用 do_fork

c++ - 最快的仪器分析器是什么

c# - SerialPort 不使用长字符串写入数据 - 已修复

c++ - 列出QTable - 选择动态

multithreading - 线程加工 AX 2012

windows - 如何强行释放被其他应用程序占用或挂起的COM端口

c++ - 如何从运算符函数返回动态对象?