重定向子进程的输出
Redirecting output from child processes
在我的 c++ windows 应用程序中,我启动了多个子进程,我希望它们继承父进程的 stdout/stderr,这样如果我的应用程序的输出被重定向到某个文件,那么该文件也将包含我的应用创建的所有子进程的输出。
目前我使用没有输出重定向的 CreateProcess 来做到这一点。 MSDN 有一个如何重定向输出的示例:Creating a Child Process with Redirected Input and Output,但我想看看我有什么选择。最简单的是使用系统并从等待子进程退出的阻塞线程调用它。然后所有输出都通过管道返回给父进程的 stdout/stderr,但是在父进程中我没有机会处理来自子进程的标准输出数据。
在 windows 上还有其他函数可以启动进程:spawn, exec,这可能更容易移植到 posix 系统。
如果我想让它在 linux/osx 上工作,我应该使用什么?如果我想让它在 UWP aka WinRT 上工作,我有什么选择?我可能完全同意从阻塞线程调用 system
,但也许我更愿意能够对进程 PID(以便能够终止它)和进程 stdout/stderr 进行更多控制,以例如,在每一行前面加上 child##:
。
boost 库最近发布了 1.64 版,其中包含一个新的 boost::process
库。
其中提供了一种 C++ 方法,可以将输出重定向到管道或 asio::streambuf
,您可以从中创建 std::string
或 std::istream
来读取无论您的子进程写入什么。
您也可以阅读 boost::process
tutorials here, which shows some simple examples of reading child output. It does make heavy use of boost::asio
, so I highly recommend you read up on that。
在我的 c++ windows 应用程序中,我启动了多个子进程,我希望它们继承父进程的 stdout/stderr,这样如果我的应用程序的输出被重定向到某个文件,那么该文件也将包含我的应用创建的所有子进程的输出。
目前我使用没有输出重定向的 CreateProcess 来做到这一点。 MSDN 有一个如何重定向输出的示例:Creating a Child Process with Redirected Input and Output,但我想看看我有什么选择。最简单的是使用系统并从等待子进程退出的阻塞线程调用它。然后所有输出都通过管道返回给父进程的 stdout/stderr,但是在父进程中我没有机会处理来自子进程的标准输出数据。 在 windows 上还有其他函数可以启动进程:spawn, exec,这可能更容易移植到 posix 系统。
如果我想让它在 linux/osx 上工作,我应该使用什么?如果我想让它在 UWP aka WinRT 上工作,我有什么选择?我可能完全同意从阻塞线程调用 system
,但也许我更愿意能够对进程 PID(以便能够终止它)和进程 stdout/stderr 进行更多控制,以例如,在每一行前面加上 child##:
。
boost 库最近发布了 1.64 版,其中包含一个新的 boost::process
库。
其中提供了一种 C++ 方法,可以将输出重定向到管道或 asio::streambuf
,您可以从中创建 std::string
或 std::istream
来读取无论您的子进程写入什么。
您也可以阅读 boost::process
tutorials here, which shows some simple examples of reading child output. It does make heavy use of boost::asio
, so I highly recommend you read up on that。