重定向子进程的输出

Redirecting output from child processes

本文关键字:输出 子进程 重定向      更新时间:2023-10-16

在我的 c++ Windows 应用程序中,我启动了多个子进程,我希望它们继承父进程的 stdout/stderr,这样如果我的应用程序的输出被重定向到某个文件,那么该文件还将包含我的应用程序创建的所有子进程的输出。

目前,我使用没有输出重定向的创建过程来做到这一点。MSDN 有一个如何重定向输出的示例:使用重定向的输入和输出创建子进程,但我想看看我有什么替代方案。最简单的方法是使用 system 并从等待子退出的阻塞线程调用它。然后,所有输出都通过管道传输回父级的 stdout/stderr,但是在父进程中,我没有机会处理来自子级的 stdout 数据。 还有其他函数可以在Windows上启动进程:spawn,exec,这可能更容易移植到posix系统。

如果我希望它在 linux/osx 上运行,我应该使用什么?如果我希望它在 UWP 又名 WinRT 上运行,我有什么选择?我可能完全可以接受从阻塞线程调用system,但也许我更愿意能够对进程 PID(能够终止它)和进程 stdout/stderr 进行更多控制,例如在每一行前面加上child##:

boost 库最近发布了 1.64 版,其中包括一个新的boost::process库。

在其中,您将获得一种能够将输出重定向到管道或asio::streambuf的C++方法,您可以从中创建std::stringstd::istream来读取子进程编写的任何内容。

您可以在此处阅读boost::process教程,其中显示了读取子输出的一些简单示例。它确实大量使用boost::asio,所以我强烈建议你也阅读一下。