gpt4 book ai didi

c++ - 当 stderr 重定向到管道时,为什么 boost::process 在 Windows 上崩溃?

转载 作者:可可西里 更新时间:2023-11-01 13:27:16 26 4
gpt4 key购买 nike

此代码基于 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 并打印其输出,即。 e.您的计算机网络名称。

您可能会看到 error 变量未被使用。阅读 stderr 也是合乎逻辑的,即使 hostname.exe 通常不使用它,实际的子进程当然可能会使用它。将 boost::process::std_err > boost::process::null 替换为 boost::process::std_err > error 看起来很简单。但是,它会导致崩溃。错误信息如下:

vector iterator not dereferencable

有谁知道原因以及如何绕过这个错误?

最佳答案

这是 Boost Process 中的一个错误。崩溃出现在include\boost\process\detail\windows\async_out.hpp导致崩溃的代码如下:

arg.resize(buffer->size());
is.read(&*arg.begin(), buffer->size());

我们是否重定向std_errstd_out 并不重要。当流不生成任何输出时出现问题。对于 hostname.exe,它是 std_err,但是,如果您尝试运行 pyw.exe,您将收到此错误 std_out 也是。

当 progam 没有输出时,buffer->size() 返回 0,因此 vector 变为空 vector 。看起来在 Visual C++ 中尝试取消引用空 vector 会导致崩溃(调试断言)。

修复如下:

auto bufferSize = buffer->size();
if (bufferSize) {
arg.resize(buffer->size());
is.read(&*arg.begin(), buffer->size());
}

我没有提交这个错误报告来 boost ,如果有人有时间,让他做吧。

关于c++ - 当 stderr 重定向到管道时,为什么 boost::process 在 Windows 上崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47554528/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com