如何使用 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 捕获另一个进程的输出?的主要内容,如果未能解决你的问题,请参考以下文章
如何捕获从 python 子进程运行的 git clone 命令的输出