我在我们自己的自定义包装器中包装来自BSD项目的现有C++代码,我希望尽可能少地将它集成到我们的代码中.此代码用于fprintf
打印到stderr以记录/报告错误.
我想将其重定向到同一进程中的替代位置.在Unix上我用a socketpair
和a 完成了thread
:套接字的一端是我发送stderr(通过调用dup2
)的地方,另一端是在一个线程中监视,然后我可以处理输出.
这在Windows上不起作用,因为套接字与文件句柄不同.
我在网上找到的所有文档都显示了如何重定向子进程的输出,这不是我想要的.如何在同一进程中重定向stderr,在写入输出时获得某种回调?(在你这么说之前,我已经尝试过SetStdHandle
但找不到任何办法让这项工作)......
您可以在Windows上使用类似的技术,您只需要为相同的概念使用不同的单词.:)这篇文章:http://msdn.microsoft.com/en-us/library/ms682499.aspx使用win32管道来处理来自另一个进程的I/O,你只需要对同一个线程做同样的事情处理.当然,在您的情况下,从流程中的任何位置到stderr的所有输出都将重定向到您的消费者.
实际上,您可能需要的其他部分是_fdopen和_open_osfhandle.实际上,这是我多年前发布的一些代码的相关示例:
DWORD CALLBACK DoDebugThread(void *) { AllocConsole(); SetConsoleTitle("Copilot Debugger"); // The following is a really disgusting hack to make stdin and stdout attach // to the newly created console using the MSVC++ libraries. I hope other // operating systems don't need this kind of kludge.. :) stdout->_file = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT); stdin->_file = _open_osfhandle((long)GetStdHandle(STD_INPUT_HANDLE), _O_TEXT); debug(); stdout->_file = -1; stdin->_file = -1; FreeConsole(); CPU_run(); return 0; }
在这种情况下,主进程是一个GUI进程,它根本不以stdio句柄开头.它打开一个控制台,然后将右侧句柄推入stdout和stdin,这样debug()函数(设计为stdio交互式函数)可以与新创建的控制台进行交互.您应该能够打开一些管道并执行相同的操作来重定向stderr.