Размер буфера в процессе форсирования

Я использую boost::process читать асинхронно вывод консольного приложения в Windows. Я заметил, что события чтения запускаются после примерно 4 тыс. Данных каждый раз.

Если я установлю свой буфер 'buf' на небольшое значение, ничего не изменится: событие запускается несколько раз ТОЛЬКО после передачи 4k данных.

Насколько я понимаю, это может быть безопасный механизм, используемый в Windows, чтобы избежать тупиковой ситуации при чтении из канала.

Есть ли способ в 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(); 
   }

1 ответ

Возможно, вам придется контролировать "отправляющую" сторону (так, MyApp.exe).

В UNIX есть stdbuf (с помощью setvbuff), unbuffer и тому подобное. Инструменты могут иметь встроенную поддержку (например, grep --line-buffered).

В Windows я не уверен. Вот несколько советов: Отключите буферизацию на перенаправленном стандартном канале (Win32 API, C++)

Другие вопросы по тегам