use*_*219 5 linux serial-port embedded-linux
最近我发现了一个对我来说很新的问题,我很感激建议。我正在 Linux 上使用 termios 函数进行串行通信。我实际上没有使用真正的串口,而是使用虚拟小工具串口驱动程序/dev/ttyGS0。文件描述符以非阻塞方式打开。
我的程序定期生成数据并将其发送到/dev/ttyGS0。无论对方读与否,都没有任何信息。如果没有,某些内部 fifo 会被填满,并且写入会返回“将阻塞”错误。到目前为止一切顺利,我对此没有任何问题。
问题是,当我想关闭这样的带有已填充 fifo 的文件描述符时,关闭函数会阻塞!不是无限期,而是大约 10 秒。
我在关闭前尝试过,tcflush(uart->fd, TCOFLUSH)没有任何效果。
这对我来说是非常奇怪的行为,我没有发现任何描述,关闭可能会阻止。有什么办法可以避免这种情况吗?或者至少减少这个超时?我应该在哪里查找这个超时?VTIME 属性对此也没有影响。
正如 Amardeep 提到的, close() 调用由驱动程序处理。Close 本身始终是一个阻塞调用,但通常它是一个快速的调用。
因此,答案是延迟特定于虚拟小工具驱动程序。我没有这方面的经验,无法提供帮助。
关闭文件有多重要?如果延迟是一个主要问题并且需要关闭文件(例如避免长时间运行的进程中的文件描述符泄漏),则可能需要在单独的线程中调用关闭。显然,最好的答案是针对该驾驶员的;也许那里的研究可能会产生答案,例如清除虚拟设备状态的 ioctl() 调用。
| 归档时间: |
|
| 查看次数: |
5818 次 |
| 最近记录: |