在我的应用程序中,我想将通常转到stdout流的输出重定向到我定义的函数.我读到你可以将stdio重定向到一个文件,为什么不用一个函数呢?
例如:
void MyHandler( const char* data );
//<<Magical redirection code>>
printf( "test" );
std::cout << "test" << std::endl;
//MyHandler should have been called with "test" twice, at this point
Run Code Online (Sandbox Code Playgroud)
我想:
我知道如何使用dup2和freopen:
......但我不确定第2项?
原因:我想将数据后处理到stdout/err(来自第三方代码),然后将其发送到网络服务器 - 同时让应用程序正常运行.
为什么?...因为现在当我们的应用程序运行时,我们看到关键数据从第三方代码转到stdout(和错误),并且它是一个让用户尝试使用本地日志文件的PITA.我宁愿将"最后N个字节"捕获到环形缓冲区中,对其进行后处理,然后 - 如果用户报告存在问题 - 将其发送到服务器.
为什么要避免文件?...因为这是针对必须在iOS和桌面上运行的代码,并且"不断写入文件"是我想要避免的,因为我不想将它作为文件.另外......我不得不担心维护该文件,主动修剪其大小等.
我使用 setbuf 来将 stdout 重定向到 char 缓冲区,但是当我只想将新数据写入 stdout 时,它会产生一些副作用
正如下面的代码所解释的:
#define bufSize 100
int main()
{
char buf[bufSize];
setbuf(stdout, buf);
printf("123"); //123 is written to the buffer
setbuf(stdout,NULL); //123 is written to the stdout(unwanted side effect)
printf("456"); //123456 appears in the stdout
}
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
关于此的其他问题 - 这段代码适用于 unix/linux/mac os 吗?
谁能提出重定向的解决方案?