此代码基于boost::process
1.65.1样本并修复了一些拼写错误:
#include <boost/process.hpp>
int main(int argc, char *argv[])
{
boost::asio::io_service ios;
std::future<std::vector<char>> output, error;
boost::process::child c("hostname.exe",
boost::process::std_out > output,
boost::process::std_err > boost::process::null,
ios);
ios.run();
c.wait();
if (output.valid())
{
auto processOutput = output.get();
processOutput.push_back('\0');
printf(processOutput.data());
}
if (error.valid())
{
auto processError = error.get();
processError.push_back('\0');
printf(processError.data());
}
return 0;
}
它按预期工作。它运行hostname.exe
并打印其输出,i。即您的计算机网络名称。
您可能会看到error
变量未使用。阅读stderr
也是合乎逻辑的,即使hostname.exe
通常不使用它,现实的子过程当然可以使用它。将boost::process::std_err > boost::process::null
替换为boost::process::std_err > error
似乎微不足道。但是,它会导致崩溃。错误消息如下:
vector iterator not dereferencable
有谁知道原因以及如何绕过这个错误?
答案 0 :(得分:1)
这是Boost Process中的一个错误。崩溃出现在include\boost\process\detail\windows\async_out.hpp
导致崩溃的代码如下:
arg.resize(buffer->size());
is.read(&*arg.begin(), buffer->size());
重定向std_err
或std_out
并不重要。当流不生成任何输出时,会出现此问题。对于hostname.exe
,它是std_err
,但是,如果您尝试运行pyw.exe
,则std_out
也会出现此错误。
当progam没有生成输出时,buffer->size()
返回0,因此向量变为空。看起来尝试取消引用空向量会导致Visual C ++崩溃(调试断言)。
修复如下:
auto bufferSize = buffer->size();
if (bufferSize) {
arg.resize(buffer->size());
is.read(&*arg.begin(), buffer->size());
}
我没有提交这个错误报告来提升,如果有人有时间,就让他去做。