gpt4 book ai didi

c++ - 升压过程中的管道缓冲区大小

转载 作者:太空宇宙 更新时间:2023-11-04 12:45:51 31 4
gpt4 key购买 nike

我正在使用 boost::process 异步读取 Windows 控制台应用程序的输出。我注意到每次读取大约 4k 数据后都会触发读取事件。

如果我将缓冲区“buf”设置为较小的值,则不会有任何变化:仅在传输 4k 数据后才会多次触发该事件。

据我了解,这可能是 Windows 中使用的一种安全机制,可避免在从管道读取数据时发生死锁。

boost::process 中有什么方法可以改变 PIPE 用来传输数据的缓冲区的大小吗?

   #include <boost/process.hpp>
#include <boost/asio.hpp>

using namespace boost::process;
boost::asio::io_service ios;

std::vector<char> buf(200);
async_pipe ap(ios);

void read_from_buffer(const boost::system::error_code &ec, std::size_t size)
{
if (ec)
{
std::cout << "error" << std::endl;
return;
}

std::cout << "--read-- " << size << std::endl;
for (size_t i = 0; i < size; i++) std::cout << buf[i];
std::cout << std::endl;


ap.async_read_some(boost::asio::buffer(buf), read_from_buffer);
}


int main()
{
child c("MyApp.exe --args", std_out > ap);
ap.async_read_some(boost::asio::buffer(buf), read_from_buffer);
ios.run();
int result = c.exit_code();
}

最佳答案

您可能必须控制“发送”方(因此,MyApp.exe)。

在 UNIX 上有 stdbuf(使用 setvbuff)、unbuffer 和类似的。工具可能有一些内置支持(例如 grep --line-buffered)。

在 Windows 上,我不确定。这里有一些建议:Disable buffering on redirected stdout Pipe (Win32 API, C++)

关于c++ - 升压过程中的管道缓冲区大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51658072/

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