我想:
我知道如何使用dup2和freopen:
......但我不确定第2项?
原因:我想将数据后处理到stdout/err(来自第三方代码),然后将其发送到网络服务器 - 同时让应用程序正常运行.
为什么?...因为现在当我们的应用程序运行时,我们看到关键数据从第三方代码转到stdout(和错误),并且它是一个让用户尝试使用本地日志文件的PITA.我宁愿将"最后N个字节"捕获到环形缓冲区中,对其进行后处理,然后 - 如果用户报告存在问题 - 将其发送到服务器.
为什么要避免文件?...因为这是针对必须在iOS和桌面上运行的代码,并且"不断写入文件"是我想要避免的,因为我不想将它作为文件.另外......我不得不担心维护该文件,主动修剪其大小等.
Stdout是一个基本的文件句柄,这意味着它是一个指针。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv);
int main (argc,argv)
int argc;
char **argv;
{
stdout = &(*stderr);
fprintf(stdout, "test");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
通过声明stdout指向不同的文件句柄,该程序将重定向stdout。要对其进行测试,请将其编译为test,然后在命令行上键入./test > t和./test 2> t。
重定向的stdout管道仍将输出单词test,而重定向的stderr管道则不会。
由于文件是流,因此请阅读GNU C库的本节以了解如何创建内存流。本示例创建一个文本缓冲区以动态调整大小以容纳输入,并重定向stdout指向它。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv);
int main (argc,argv)
int argc;
char **argv;
{
char *bp;
size_t size;
FILE *stream;
stream = open_memstream (&bp, &size);
stdout = &(*stream);
fprintf(stdout, "test");
fflush(stdout);
fprintf(stderr, "buf = %s, size = %d\n", bp, size);
fclose (stream);
free(bp);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在手册中的输入和输出之间切换时,请特别注意冲洗缓冲区的部分。
| 归档时间: |
|
| 查看次数: |
3065 次 |
| 最近记录: |