无法使用Boost.Process捕获进程的标准输出

目前我正在使用Boost沙盒中的Boost.Process,并且遇到问题以便正确捕获我的标准输出; 想知道是否有人可以给我第二双眼球成为我可能做错了什么。

我正在尝试使用DCRAW(最新版本)从RAW相机图像中缩略图,并捕获它们以转换为QT QImage。

进程启动function:

namespace bf = ::boost::filesystem; namespace bp = ::boost::process; QImage DCRawInterface::convertRawImage(string path) { // commandline: dcraw -e -c <srcfile> -> piped to stdout. if ( bf::exists( path ) ) { std::string exec = "bin\\dcraw.exe"; std::vector<std::string> args; args.push_back("-v"); args.push_back("-c"); args.push_back("-e"); args.push_back(path); bp::context ctx; ctx.stdout_behavior = bp::capture_stream(); bp::child c = bp::launch(exec, args, ctx); bp::pistream &is = c.get_stdout(); ofstream output("C:\\temp\\testcfk.jpg"); streamcopy(is, output); } return (NULL); } inline void streamcopy(std::istream& input, std::ostream& out) { char buffer[4096]; int i = 0; while (!input.eof() ) { memset(buffer, 0, sizeof(buffer)); int bytes = input.readsome(buffer, sizeof buffer); out.write(buffer, bytes); i++; } } 

调用转换器:

 DCRawInterface DcRaw; DcRaw.convertRawImage("test/CFK_2439.NEF"); 

目标是简单地validation我可以将inputstream复制到输出文件。

目前,如果我注释掉下面这行:

  args.push_back("-c"); 

那么这个缩略图就是由DCRAW编写的,名字为CFK_2439.thumb.jpg的源代码目录,这certificate这个过程是通过正确的参数来调用的。 没有发生的事情是正确地连接到输出pipe道。

FWIW:我在Eclipse 3.5 /最新MingW(GCC 4.4)下的Windows XP上执行此testing。

[UPDATE]

从debugging开始,看起来代码到达stream拷贝时,文件/pipe道已经closures – bytes = input.readsome(…)绝不是0以外的任何值。

那么我认为你需要正确的重定向输出流。 在我的应用程序这样的工作:

 [...] bp::command_line cl(_commandLine); bp::launcher l; l.set_stdout_behavior(bp::redirect_stream); l.set_stdin_behavior(bp::redirect_stream); l.set_merge_out_err(true); bp::child c = l.start(cl); bp::pistream& is = c.get_stdout(); string result; string line; while (std::getline(is, line) && !_isStopped) { result += line; } c.wait(); [...] 

没有重定向,如果我没有记错的话,stdout将无处可去。 如果要获得整个输出,等待进程结束是一个好习惯。

编辑:

我在Linux上也许是一个老版本的boost.process。 我意识到你的代码与我给你的片段相似。 c.wait()可能是关键…

编辑:Boost.process 0.1 🙂

如果迁移到“最新的”boost.process不是一个问题(如你所知,这个库有几个变种),你可以使用以下( http://www.highscore.de/boost/process0&#x3002; 5 / )

 file_descriptor_sink sink("stdout.txt"); execute( run_exe("test.exe"), bind_stdout(sink) );