您可以在 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。