【问题标题】:Pipe buffer size in boost process升压过程中的管道缓冲区大小
【发布时间】:2018-08-02 16:11:31
【问题描述】:

我正在使用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(); 
   }

【问题讨论】:

  • 您确定缓冲区不在生成输出的控制台应用程序中吗?当 stdout 不是控制台窗口时,大多数标准库实现都会改变它们的行为以缓冲更多。更全面的解释:codeproject.com/Articles/16163/…
  • 管道具有可以原子地传输的最大消息大小 - 请参阅PIPE_BUF - 在 Linux 上(例如)它是 4096 字节 afaik。
  • @DarkFalcon:生成输出的应用程序会在每一行刷新屏幕上的文本。我没有看到任何使用 std::setvbuf 来改变正常行为,所以我的假设是应用程序没有做任何深奥的事情。
  • @JesperJuhl:..对不起,我对 Wndows 不太熟悉..你提到的 PIPE_BUF 是什么,我在哪里可以找到相关信息?
  • PIPE_BUF 是 Posix 的东西(例如参见 linux.die.net/man/7/pipe),但我相信 Windows 也有类似的东西。至于在哪里可以找到信息,一般的答案是;使用您最喜欢的搜索引擎。

标签: c++ windows pipe boost-asio boost-process


【解决方案1】:

您可能必须控制“发送”端(所以,MyApp.exe)。

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

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

【讨论】:

  • 我无法控制它,因为 boost::process 会执行对已使用管道的所有调用。我的问题是关于我在 boost::process 中对这些管道有多少控制权。
  • 无。另请参阅链接的答案,即使无法访问该进程,它也可能控制连接到底层进程的管道。无论您发现什么都是专有的,不会是便携式增强功能。但您可以设计和提交扩展。
  • @AbruzzoForteeGentile 是的,您确实有控制权,您可以通过native_handle api 访问管道句柄。
  • 这并不意味着您可以控制发送端的缓冲。您可能会,具体取决于应用程序的平台和实现。你的意思是你有它为你的案子工作吗?如果是这样,请考虑写一个小答案,将来可能对其他人有所帮助
猜你喜欢
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
相关资源
最近更新 更多