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

时间:2018-08-02 16:11:31

标签: c++ windows pipe boost-asio 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(); 
   }

1 个答案:

答案 0 :(得分:0)

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

在UNIX上,有stdbuf(使用setvbuff),unbuffer等。工具可能内置了一些支持(例如grep --line-buffered)。

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