【问题标题】:How to make the read function not to hang?如何使读取功能不挂起?
【发布时间】:2010-10-23 00:02:43
【问题描述】:

我正在使用 socat 创建一个虚拟串口:

socat PTY,link=/dev/ttySV0,echo=1 PTY,link=/dev/ttySV1,echo=1

在我用 C++ 编写的程序中,我打开 ttySV1 端口并开始读取。

read 函数在一段时间内,但问题是 read 函数挂起,直到我向端口发送数据。你知道如何让 taht 函数不挂起,如果缓冲区没有数据就退出吗?

编辑:我使用以下方式将数据发送到端口:

echo [data] > /dev/ttySV0

【问题讨论】:

  • 要么使用 peek 函数,要么使用多线程。

标签: c++ serial-port posix virtual-serial-port


【解决方案1】:

您还可以使用系统读取功能,具体取决于您运行的操作系统。 详情应在 man (3) 下阅读。

您必须使用 fnctl 设置 O_NONBLOCK。如果管道 / FIFO 当前为空,这将导致您的读取失败。我检查了 Linux 的手册页,但它们在大多数基于 POSIX 的系统中应该是类似的行为。

【讨论】:

  • 太棒了!我正在使用该读取功能(我的操作系统是 Arch Linux)。不同之处在于缺少 O_NONBLOCK 选项。现在我把它放进去,它就像一个魅力。谢谢!
  • 很高兴这有效。我喜欢处理系统 API 及其隐藏的选项和控件:)
【解决方案2】:

一种方法是使用 select() 方法来查看是否有数据要读取。 This 或在 google 上找到的其他内容(我搜索了“bsd sockets select”)应该会引导你走上正确的道路。

【讨论】:

    猜你喜欢
    • 2020-03-13
    • 2021-10-31
    • 2015-07-14
    • 2020-05-19
    • 1970-01-01
    • 2021-10-05
    • 2021-05-08
    • 2020-02-22
    • 1970-01-01
    相关资源
    最近更新 更多