Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 内部捕获/重定向标准输出?_C_Unix_Printf_Stdout - Fatal编程技术网

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

C 内部捕获/重定向标准输出?,c,unix,printf,stdout,C,Unix,Printf,Stdout,这似乎有点像计算机系统101的问题,但我被难倒了 我正在将C/C++项目A中的现有代码集成到我自己的项目B中。A和B都将链接到单个可执行的线程化进程中。项目A的代码广泛使用printf进行输出。这很好,但我也想将输出捕获到我自己的缓冲区中。一旦printf调用写入stdout,有没有一种方法可以读取它?我不能用叉子叉这个过程或管道。我尝试轮询()标准输出,或者复制()标准输出,但没有成功(我可能在这里做错了什么)。一旦它消失,它就消失了。如果您想将所有调用编译成一个可执行文件,您必须通过搜索和替

这似乎有点像计算机系统101的问题,但我被难倒了


我正在将C/C++项目A中的现有代码集成到我自己的项目B中。A和B都将链接到单个可执行的线程化进程中。项目A的代码广泛使用printf进行输出。这很好,但我也想将输出捕获到我自己的缓冲区中。一旦printf调用写入stdout,有没有一种方法可以读取它?我不能用叉子叉这个过程或管道。我尝试轮询()标准输出,或者复制()标准输出,但没有成功(我可能在这里做错了什么)。

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

在您使用printf()之前,您可以关闭fd 1和dup2()已创建到fd 1中的管道。

您可以使用它更改描述符

#include<stdio.h>

main(int argc, char** argv) {
    FILE *fp = freopen("output.txt", "w", stdout);
    printf("Hello\n");
    fclose(fp);
}
#包括
主(内部argc,字符**argv){
文件*fp=freopen(“output.txt”,“w”,stdout);
printf(“Hello\n”);
fclose(fp);
}
如果运行该命令,您将在output.txt中看到printf输出,屏幕上不会显示任何内容


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

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


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

你不能将A的输出导入B吗?(
$commandprompt>/A |/B
)。我假设它们都是可执行文件,并且A可以在BSound之前运行,就像您希望将它们保留为seprate可执行文件一样,然后在运行时使用管道连接它们。不幸的是,A和B必须链接到单个执行文件。将此问题链接到[this][1]。[1] :Nick,这确实是我实施的工作,但我希望我只是在poll()和dup()上做错了什么。啊,好吧,是时候向前迈进了!谢谢你的回答。顺便说一句,我喜欢你的图标:)它是冲着去做它的事情。pipes和stdout的整个理念是应用程序不会保留这些东西;它们会根据需要缓冲,然后立即将其清除。这样,将应用程序连接在一起不会占用太多内存。如果你设计的东西使所有以前的输出都能保留下来供以后使用,那就没有办法了。你可以随时定义printf(…)fprintf(myfile,u VA_ARGS)…甚至不需要关闭fd 1-
dup2
都可以帮你完成。