【问题标题】:How can I capture another process's output using C?如何使用 C 捕获另一个进程的输出?
【发布时间】:2023-12-29 15:38:01
【问题描述】:

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

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

【问题讨论】:

  • 什么平台(linux、unix、windows等...)这将真正改变答案

标签: c capture


【解决方案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,您显然可以使用管道

    【讨论】:

      最近更新 更多