【发布时间】:2018-03-06 21:02:04
【问题描述】:
我尝试使用boost::process,它看起来像是 boost 中非常错误的部分;无论如何,可能有人知道解决方法。
最常见的任务是执行流程并获得其完整(真正完整)的输出。通常输出也可能是二进制的,因此我们不能在一般情况下使用string。
来自boost文档的异步示例不起作用,论坛上的其他文章已经提到过,所以我尝试使用最简单的同步算法。当然,我知道死锁风险,但是boost 没有走到这一步,它之前就失败了。
代码思路如下:
bool ReadPipe(boost::process::ipstream &pipe, vector<char> &output)
{
char buffer[4096];
pipe.read(buffer, 4096);
auto bytesRead = pipe.gcount();
if (bytesRead)
output.insert(output.end(), buffer, buffer + bytesRead);
return bytesRead != 0;
}
boost::process::ipstream output;
vector<char> processOutput;
string cmdline = "somthing";
boost::process::child c(cmdLine.c_str(),
boost::process::std_in.close(),
boost::process::std_out > output);
while (c.running())
Reader::ReadPipe(output, processOutput);
Reader::ReadPipe(output, processOutput);
在这段代码中,我们创建进程,将其标准输出重定向到ipstream,在应用程序运行时读取它,并在应用程序存在后读取可能的其余数据。
在 Windows 上运行正常。在 Ubuntu 16 上它有时可以工作,有时返回部分输出,有时不返回任何输出。
有谁知道它为什么如此不稳定,有没有任何现实的方法可以使用boost::process 从任何应用程序获取完整的、可能是二进制的输出,就像 Linux 终端可以做到的那样?
【问题讨论】:
-
哪些命令可以提供部分输出?对于特定命令是否一致,或者同一命令有时会给出完整的输出,有时不会?我注意到您没有重定向标准错误;也许缺少的输出正在那里写。
-
我以同样的方式重定向
stderr,我只是简化了示例。我使用adb命令(Android 调试桥)对其进行测试,例如,adb shell ifconfig有时会返回完整输出,有时则不会。