【问题标题】:Internally capture/redirect stdout?内部捕获/重定向标准输出?
【发布时间】:2011-09-02 17:07:58
【问题描述】:

这似乎有点像计算系统 101 问题,但我被难住了。

我正在将 C/C++ 项目 A 中的现有代码集成到我自己的项目 B 中。A 和 B 都将链接到一个可执行的线程进程中。项目 A 的代码大量使用 printf 进行输出。这很好,但我也想将该输出捕获到我自己的缓冲区中。一旦 printf 调用写入标准输出,有没有办法从标准输出中读取?我无法分叉进程或管道。我对标准输出的 poll() 或 dup() 的努力没有成功(我可能在这里做错了)。

【问题讨论】:

  • 你不能将 A 的输出传送到 B 中吗? ($commandprompt> ./A | ./B)。我假设它们都是可执行文件,并且 A 可以在 B 之前运行
  • 听起来您想将它们保留为单独的可执行文件,然后在运行时使用管道连接它们。
  • 不幸的是,没有。 A 和 B 必须链接到一个 exec 中。
  • 将此问题链接到 [this][1]。 [1]:stackoverflow.com/q/5179108/1224741

标签: c unix printf stdout


【解决方案1】:

您可以使用freopen 更改描述符。

#include<stdio.h>

main(int argc, char** argv) {
    FILE *fp = freopen("output.txt", "w", stdout);
    printf("Hello\n");
    fclose(fp);
}

如果您运行它,您将在 output.txt 中看到 printf 输出,并且屏幕上不会显示任何内容。

您现在可以打开文件来读取数据,或者您甚至可以将其mmap 放入您的内存空间并以这种方式处理它。

【讨论】:

    【解决方案2】:

    在你 printf() 之前,你可以关闭 fd 1,然后 dup2() 一个你在 fd 1 中创建的管道。

    【讨论】:

    • ...甚至不需要关闭 fd 1 - dup2 会为您完成。
    【解决方案3】:

    更不用说:现在有一个方便的 U-Streams C 源代码库,它使重定向 stdout 和 stderr 变得非常简单。您甚至可以非常轻松地将它们重定向到多个目的地。而且,您可以创建自己的流,除此之外,可以以完全相同的方式使用 stdout 和 stderr。

    寻找 U-Streams C 库...确实很方便。

    【讨论】:

      【解决方案4】:

      一旦它出去了,它就消失了。如果要将其全部编译为单个可执行文件,则必须通过搜索和替换来检查 A 的代码,并将所有这些 printf 调用更改为您自己的流,您可以在其中复制它们,然后将它们传递到标准输出。

      【讨论】:

      • 尼克,这确实是我实施的解决方法,但希望我只是在 poll() 和 dup() 上做错了。嗯,是时候继续前进了!感谢你的回答。顺便说一句,我喜欢你的图标 :)
      • 它脸红了,开始做它的事。管道和标准输出的整个想法是应用程序不会保留这些东西。他们根据需要缓冲,然后立即摆脱它。这样,管道应用程序就不会占用太多内存。如果您设计的东西要保留所有以前的输出以供以后使用,就没有办法做到这一点。
      • 你总是可以做到#define printf(...) fprintf(myfile, __VA_ARGS__)
      猜你喜欢
      • 1970-01-01
      • 2014-01-20
      • 2011-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多