内部捕获/重定向标准输出?

时间:2011-09-02 17:07:59

标签: c unix printf stdout

这似乎有点像计算系统101的问题,但我很难过。

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

4 个答案:

答案 0 :(得分:4)

您可以使用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将其放入您的内存空间并以此方式处理它。

答案 1 :(得分:2)

在printf()之前,您可以关闭fd 1,并将dup2()管道创建为fd 1。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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