C++ boost过程中的管道缓冲区大小
我正在使用C++ boost过程中的管道缓冲区大小,c++,windows,pipe,boost-asio,boost-process,C++,Windows,Pipe,Boost Asio,Boost Process,我正在使用boost::process异步读取Windows中控制台应用程序的输出。我注意到每次读取大约4k数据后都会触发读取事件 如果我将缓冲区“buf”设置为一个较小的值,则不会发生任何变化:只有在传输了4k数据之后,才会多次触发该事件 据我所知,这可能是一种安全机制,用于窗户,以避免从管道读取时死锁 在boost::process中是否有任何方法可以更改管道用于传输数据的缓冲区的大小 #include <boost/process.hpp> #include <
boost::process
异步读取Windows中控制台应用程序的输出。我注意到每次读取大约4k数据后都会触发读取事件
如果我将缓冲区“buf”设置为一个较小的值,则不会发生任何变化:只有在传输了4k数据之后,才会多次触发该事件
据我所知,这可能是一种安全机制,用于窗户,以避免从管道读取时死锁
在boost::process
中是否有任何方法可以更改管道用于传输数据的缓冲区的大小
#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();
}
#包括
#包括
使用名称空间boost::process;
boost::asio::io_服务ios;
std::载体buf(200);
异步管道ap(ios);
无效从缓冲区读取(常量boost::system::error\u code&ec,std::size\u t size)
{
国际单项体育联合会(欧共体)
{
std::cout您可能必须控制“发送”端(因此,MyApp.exe
)
在UNIX上有stdbuf
(使用setvbuff
)、unbuffer
和类似工具。工具可能具有一些内置支持(例如grep--line buffered
)
在Windows上,我不确定。这里有一些提示:您确定缓冲区不在生成输出的控制台应用程序中吗?大多数标准库实现在stdout不是控制台窗口时会将其行为更改为缓冲更多。更全面的解释是:管道具有可以原子传输的最大消息大小-seePIPE\u BUF
-在Linux上(例如)每行4096字节。@DarkFalcon:生成输出的应用程序在屏幕上的每一行刷新文本。我没有看到任何使用std::setvbuf来改变正常行为的情况,所以我的假设是应用程序不会做任何离奇的事。@JesperJuhl:…对不起,我对Wndows不是很有经验。你给我的那个管道是什么我在哪里可以找到关于它的信息?PIPE_BUF是Posix的东西(参见示例)但我相信Windows也有类似的功能。至于在哪里查找信息,一般的答案是:使用您最喜欢的搜索引擎。我无法控制这一点,因为boost::process会调用所有使用过的管道。我的问题是,在boost::process.None中,我对这些管道有多大的控制权。另外,请参阅可能给出c的链接答案对连接到基础进程的管道进行控制,即使没有访问该进程的权限。您将发现的任何内容都是专有的,不会成为可移植的boost功能。但您可以设计和提交扩展。@Abruzzofortegentile是的,您有权通过本机\u句柄
api访问管道句柄在一点也不意味着你控制发送端的缓冲。你可以根据应用程序的平台和应用来执行。你的意思是你有它为你的用例工作吗?如果是的话,考虑写一个小的答案,它可能会帮助其他人在未来。