Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost过程中的管道缓冲区大小_C++_Windows_Pipe_Boost Asio_Boost Process - Fatal编程技术网

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不是控制台窗口时会将其行为更改为缓冲更多。更全面的解释是:管道具有可以原子传输的最大消息大小-see
PIPE\u BUF
-在Linux上(例如)每行4096字节。@DarkFalcon:生成输出的应用程序在屏幕上的每一行刷新文本。我没有看到任何使用std::setvbuf来改变正常行为的情况,所以我的假设是应用程序不会做任何离奇的事。@JesperJuhl:…对不起,我对Wndows不是很有经验。你给我的那个管道是什么我在哪里可以找到关于它的信息?PIPE_BUF是Posix的东西(参见示例)但我相信Windows也有类似的功能。至于在哪里查找信息,一般的答案是:使用您最喜欢的搜索引擎。我无法控制这一点,因为boost::process会调用所有使用过的管道。我的问题是,在boost::process.None中,我对这些管道有多大的控制权。另外,请参阅可能给出c的链接答案对连接到基础进程的管道进行控制,即使没有访问该进程的权限。您将发现的任何内容都是专有的,不会成为可移植的boost功能。但您可以设计和提交扩展。@Abruzzofortegentile是的,您有权通过
本机\u句柄
api访问管道句柄在一点也不意味着你控制发送端的缓冲。你可以根据应用程序的平台和应用来执行。你的意思是你有它为你的用例工作吗?如果是的话,考虑写一个小的答案,它可能会帮助其他人在未来。