最近我遇到了一个问题,这对我来说是比较新的,我需要一些建议。我正在使用termios函数在Linux上进行串口通信。实际上,我并没有使用真正的串口,而是虚拟的串口驱动程序 /dev/ttyGS0
。文件描述符被打开为非阻塞。
我的程序周期性地生成数据并将其发送到 /dev/ttyGS0。没有信息表明另一端是否读取了它。如果没有读取,一些内部fifo就会填满,并返回“would block”错误。到目前为止,我没有遇到任何问题。
问题是,当我想要关闭这样的文件描述符时,带有填充的fifo,close函数会阻塞!不是无限期的,但大约需要10秒钟。
我尝试在关闭之前执行tcflush(uart->fd, TCOFLUSH)
,但没有任何效果。
这对我来说是如此奇怪的行为,我找不到任何描述,close可能会阻塞。有没有办法避免这种情况?或者至少减少这个超时时间?应该在哪里寻找这个超时时间?VTIME属性对此也没有影响。
close()
并阻塞是完全合理的,而且我认为非阻塞 IO 的 POSIX 语义并不适用于close()
。我期望在执行close()
后,设备将处于准备好再次进行open()
的状态。由于这是通过 USB 进行虚拟串口通信,我会开始怀疑端点的关闭是否无序,并且 10 秒后会超时。 - marko