最近我发现了一个对我来说很新的问题,我很感激建议.我正在使用termios函数在Linux上进行串行通信.我实际上不使用真正的串口,而是使用虚拟小工具串口驱动程序/ dev / ttyGS0.文件描述符作为非阻塞打开.
我的程序定期生成数据并将其发送到/ dev / ttyGS0.如果另一端读取它没有信息.如果没有,则一些内部fifo填满并写入返回“将阻止”错误.到目前为止一切顺利,我没有遇到任何问题.
问题是,当我想用填充的fifo关闭这样的文件描述符时,关闭功能块!不是无限期,但是大约10秒钟.
我试图在关闭之前做tcflush(uart-> fd,TCOFLUSH)而没有任何影响.
这对我来说是如此奇怪的行为,我没有找到任何描述,这种关闭可能会阻止.有什么方法可以避免这种情况吗?或者至少减少这个超时?我应该在哪里寻找这个超时? VTIME属性对此也没有影响.
解决方法:
正如Amardeep所提到的,close()调用由驱动程序处理.关闭本身总是一个阻止调用,但通常它是一个快速的.
因此,答案是延迟特定于虚拟小工具驱动程序.我没有经验可以提供帮助.
关闭文件有多重要?如果延迟是一个主要问题并且文件需要关闭(例如在长时间运行的进程中避免文件描述符泄漏),则可能需要在单独的线程中调用close.显然,最好的答案是特定于该驱动程序的答案;或许研究可能会产生答案,例如清除虚拟设备状态的ioctl()调用.
标签:linux,serial-port,embedded-linux
来源: https://codeday.me/bug/20190704/1372024.html