如何使用 C 捕获另一个进程的输出?

Posted

技术标签:

【中文标题】如何使用 C 捕获另一个进程的输出?【英文标题】:How can I capture another process's output using C? 【发布时间】:2009-03-14 22:35:09 【问题描述】:

如何使用纯 C 捕获另一个进程的输出?能否提供示例代码?

编辑:让我们假设 Linux。我会对“非常便携”的代码感兴趣。我要做的就是执行一个命令,捕获它的输出并以某种方式处理它。

【问题讨论】:

什么平台(linux、unix、windows等...)这将真正改变答案 【参考方案1】:

有多种选择,但在某种程度上取决于您的平台。那就是说popen 应该在大多数地方都可以工作,例如

#include <stdio.h>

FILE *stream;
stream = popen("acommand", "r");

/* use fread, fgets, etc. on stream */

pclose(stream);

请注意,这有一个非常特殊的用途,它通过运行命令 acommand 创建进程,并以某种方式附加其标准输出,以便您的程序可以通过流 FILE* 访问它。

如果您需要连接到现有流程,或者需要进行更丰富的操作,您可能需要研究其他设施。 Unix 有各种机制来连接进程标准输出等。

在 windows 下,您可以使用CreateProcess API 创建一个新进程并将其标准输出句柄连接到您想要的。 Windows 也支持popen

据我所知,没有简单的 C 方法可以做到这一点,因此它总是在某种程度上依赖于特定于平台的 API。

根据您的编辑popen 似乎很理想,它“非常便携”,我认为没有它就没有像操作系统这样的 unix,确实它是单一 Unix 规范的一部分,POSIX,它让你做你想做的事,执行一个流程,获取它的输出并处理它。

【讨论】:

【参考方案2】:

如果您可以使用系统管道,只需将其他进程的输出通过管道传输到您的 C 程序,然后在您的 C 程序中读取标准输入即可。

otherprocess | your_c_program

【讨论】:

如果你想分别处理STDERR和STDOUT这当然没用:) 不是真的可以使用 2> 和 1> 将 STDERR 和 STDOUT 重定向到单独的文件,然后 tail -f file | proc 对每个文件进行独立处理【参考方案3】:

您使用的是哪个操作系统?在 *nix 类型的操作系统上,如果您的进程正在输出到 STDOUT 或 STDERR,您显然可以使用管道

【讨论】:

以上是关于如何使用 C 捕获另一个进程的输出?的主要内容,如果未能解决你的问题,请参考以下文章

如何在unittest中捕获python子进程stdout

如何捕获 execvp 的输出

如何捕获从 python 子进程运行的 git clone 命令的输出

使用 libuv 捕获子进程的标准输出

如何捕获从 MYSQL 触发器(嵌入在另一个 py 脚本中)内部调用的 python 脚本的输出?

如何捕获kill信号,优雅的结束multiprocessing所有进程