我创建了用于读取的管道(在 C 中使用
popen
)并使用 fgets 读取其输出 - 并且效果很好。
但现在我需要两项改进,并且不知道如何进行 - 大多数答案都相对较旧,也许问题已经解决但我找不到它。
所以:
最明显的方法是创建一个用于管道的线程,它将与主任务并行地执行输出收集。但有没有更好、更简单的方法呢?谢谢。
我看到两个选项。
select
(类似)等待不同文件描述符上的事件。 POSIX 还支持 poll
,Linux 还支持 epoll
。这取决于进程中管道的非阻塞读取之间的预期时间间隔,以及由
popen
启动的特定程序。
如果间隔太长以致管道缓冲区已满,则管道写入端的大多数程序的默认行为是阻塞。虽然它们在写入管道时被阻止,但它们可能也不会做任何其他事情,除非它们是多线程的。
您可以尝试在短时间内发送大量输出的子进程,例如在大文件上的
cat
。
pipe(7)
手册页告诉我们:
管道容量
管道的容量是有限的。如果管道已满,则 write(2) 将阻塞或失败,具体取决于 O_NONBLOCK 是否 标志已设置(见下文)。不同的实现有 管道容量的不同限制。应用程序不应 依赖于特定的能力:应该设计一个应用程序 以便读取过程立即消耗数据 可用,这样写入过程就不会被阻塞。