升压过程中的管道缓冲区大小
Pipe buffer size in boost process
我正在使用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++(上的缓冲
相关文章:
- C++字符*缓冲区的大小
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- IPC使用多个管道和分支进程来运行Python程序
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- Xaudio2在更改缓冲区或循环时弹出声音
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 多线程双缓冲区
- 升压过程中的管道缓冲区大小
- 在Win32管道上将两个缓冲区合并为一个写操作
- 如何确保已读取所有管道缓冲区
- 在两个端子之间传递缓冲区(命名管道)
- 如何监控放入标准输出缓冲区的内容,并在管道中存放特定字符串时中断?
- 命名管道在c++ Linux检查缓冲区是否已满
- Opengl:基于着色器的渲染到帧缓冲区,然后是固定管道渲染
- 逐字符从管道读取缓冲区/查找管道中数据的大小