我正在处理一个应用程序,使用Boost的C++ Process库(http://www.highscore.de/boost/process0.5)启动子进程,并使用以下代码将该进程的标准输出重定向到文件中:
然而,现在我需要能够同时将子进程的标准输出打印到文件和控制台。
我找到了下面的代码,看起来应该可以完成这项工作:
我已经尝试运行上面的代码,确实可以将输出打印到控制台和文件中。 但是,在我的情况下,上述代码存在一个主要问题, while循环(
现在, 我需要能够在调用进程运行时从中获取输出,并将其打印到控制台和文件中,而不仅仅是在结尾处打印。
(由于我启动的进程不受我的控制,可能需要几分钟以上的时间才能运行,当前屏幕控制台为空,直到进程退出)。
我已经查看了很多网站,试图找到解决方案,也对代码进行了很多尝试,但似乎还没有实现解决方案。
这如何实现?(使用Boost.Process是否可行?) 我该如何使字符串/流在子进程运行时填充标准输出,而不仅仅是在结束时才填充?
boost::process::initializers::bind_stdout(boost::iostreams::file_descriptor_sink
此处为要输入的代码 )
上述解决方案和代码已经有效。然而,现在我需要能够同时将子进程的标准输出打印到文件和控制台。
我找到了下面的代码,看起来应该可以完成这项工作:
#include <boost/process.hpp>
#include <boost/iostreams/device/file_descriptor.hpp>
#include <boost/iostreams/stream.hpp>
#include <iostream>
using namespace boost::process;
using namespace boost::process::initializers;
using namespace boost::iostreams;
int main()
{
boost::process::pipe p = create_pipe();
{
file_descriptor_sink sink(p.sink, close_handle);
execute(
run_exe("/bin/echo"),
set_cmd_line("echo hello"),
bind_stdout(sink)
);
}
file_descriptor_source source(p.source, close_handle);
stream<file_descriptor_source> is(source);
std::string s;
while (std::getline(is, s))
{
std::cout << s << std::endl;
//will write line by line to file here
}
}
我已经尝试运行上面的代码,确实可以将输出打印到控制台和文件中。 但是,在我的情况下,上述代码存在一个主要问题, while循环(
while (std::getline(is, s))
)只有在调用的进程退出后才开始运行,这意味着运行过程中积累的所有输出都会在进程完成后一次性打印出来。现在, 我需要能够在调用进程运行时从中获取输出,并将其打印到控制台和文件中,而不仅仅是在结尾处打印。
(由于我启动的进程不受我的控制,可能需要几分钟以上的时间才能运行,当前屏幕控制台为空,直到进程退出)。
我已经查看了很多网站,试图找到解决方案,也对代码进行了很多尝试,但似乎还没有实现解决方案。
这如何实现?(使用Boost.Process是否可行?) 我该如何使字符串/流在子进程运行时填充标准输出,而不仅仅是在结束时才填充?
std::getline(s, is)
是一个打字错误。 - sehe