无法使用Boost.Process捕获进程的标准输出
目前我正在使用Boost沙箱中的Boost.Process,并且遇到问题以正确捕获我的标准输出; 想知道是否有人可以给我第二双眼球成为我可能做错的事。
我试图使用DCRAW(最新版本)从RAW相机图像中缩略图,并捕获它们以转换为QT QImage。
流程启动功能:
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 = "bindcraw.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:temptestcfk.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");
目标是简单地验证我可以将输入流复制到输出文件。
目前,如果我注释掉以下行:
args.push_back("-c");
那么缩略图由DCRAW写入到源目录,名称为CFK_2439.thumb.jpg,这证明该过程正在以正确的参数被调用。 没有发生的事情正确地连接到输出管道。
FWIW:我在Eclipse 3.5 / Latest MingW(GCC 4.4)下的Windows XP上执行此测试。
[UPDATE]
从调试开始,看起来代码到达流拷贝时,文件/管道已经关闭 - 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();
[...]
没有重定向,如果我没有记错的话,标准输出将无处可去。 如果您希望获得整个输出,那么等待过程结束是一个好习惯。
编辑:
我在Linux上可能是一个旧版本的boost.process。 我意识到你的代码与我给你的代码片段相似。 c.wait()可能是关键......
编辑:Boost.process 0.1 :-)
如果迁移到“最新”boost.process不是一个问题(如你所知,这个库有几个变种),你可以使用以下(http://www.highscore.de/boost/process0。 5 /)
file_descriptor_sink sink("stdout.txt");
execute(
run_exe("test.exe"),
bind_stdout(sink)
);
链接地址: http://www.djcxy.com/p/45203.html
上一篇: Unable to capture standard output of process using Boost.Process