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

Pipe buffer size in boost process

本文关键字:缓冲区 管道 过程中      更新时间:2023-10-16

我正在使用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上,我不确定。以下是一些指针:禁用重定向的stdout管道(Win32 API,C++(上的缓冲