【发布时间】:2021-08-01 23:46:16
【问题描述】:
在 2021 年,有没有办法使用 C++ 标准库的高级工具从管道进行非阻塞读取? IE。 C++17(或者可能是 C++20)?在 Linux 上进行开发,但在一定程度上可移植到其他 *NIX 是可取的。 Boost 不是我手头问题的选择。
我很了解 POSIX 功能,即 poll() 和 open() 和 O_NONBLOCK。沿着这条路线,我将实现自己的缓冲并拆分成行,而且数据是二进制的(实际上这并不是看起来那么大的问题,只要它是 unicode-utf8 并且基本上只是通过一些报告,其他现有软件将正确呈现字符,例如 Markdown 到 HTML)。
我只是在问自己,我真的必须(再次)实施吗?还是有一些现成的解决方案可用,我只是忽略了?据我了解,std::basic_istream<..> 不太合适,因为它会尝试填充底层缓冲区,并且当管道中没有足够的数据时会阻塞。
对于背景:我正在通过两个管道从子进程中检索 STDIN 和 STDERR。我必须将这两个流逐行交错。这发生在专用的读取器线程中 - 但是,即使子进程进入活锁,该读取器线程也不能卡住。
【问题讨论】:
-
C++20 协程应该可以做到这一点。
标签: c++ c++17 posix nonblocking