如何从进程中获取实时、非阻塞的输出

Posted

技术标签:

【中文标题】如何从进程中获取实时、非阻塞的输出【英文标题】:How to get live, non-blocking output from process 【发布时间】:2019-09-19 07:20:45 【问题描述】:

我希望能够捕获我没有源代码的 cli 程序的输出(在它终止之前)。

我发现的所有东西都是用管道完成的,据我所知,它只会在刷新或退出程序时发送输出。 我在 Codeproject 上找到的一种解决方案仅适用于 Windows。

【问题讨论】:

您需要使用伪 tty 来使程序取消缓冲其输出。您可以使用Expect 附带的unbuffer 程序来执行此操作。 所以你可以使用popen("unbuffer cli_program", "r") 这正是我所需要的。谢谢! 【参考方案1】:

您可以使用stdbuf 强制应用程序的stdoutstderr 进行行缓冲,即使重定向到管道或文件时也是如此:

stdbuf --output=L --error=L <program> | ...

【讨论】:

以上是关于如何从进程中获取实时、非阻塞的输出的主要内容,如果未能解决你的问题,请参考以下文章

在没有flush()和新行的子进程输出上进行非阻塞读取

#导入Word文档图片# 阻塞与非阻塞IO操作

Perl - Win32 - 如何从另一个进程非阻塞读取文件句柄?

Linux 设备驱动中的阻塞与非阻塞 I/O

并发 并行 同步 异步 多线程 阻塞 非阻塞的区别

《linux设备驱动开发详解》笔记——8阻塞与非阻塞IO