【问题标题】:Boost.Asio: How to write a custom AsyncReadStream?Boost.Asio:如何编写自定义 AsyncReadStream?
【发布时间】:2014-09-25 15:48:21
【问题描述】:

我编写了一个程序,它(除其他外)创建子进程并通过监听它们的标准输出来接收来自它们的通知。这种进程间通信机制很好,但我正在努力解决死锁。

我认为我可以使用 Boost.Asio(我已经在程序的其他部分中将其用于网络目的)及其 Proactor Pattern 实现来使我的程序(主要)是单线程的。这样一来,我就不必再为线程同步而烦恼了。

为此,我的猜测是我必须编写一个自定义的AsyncReadStream 类型(它将在线程中调用 Windows 的 ReadFile()),我可以将其与 asio::async_read_*() 函数一起使用。我的问题是我不知道如何实现 AsyncReadStream 概念的 async_read_some() 成员函数。我应该如何处理函数接收到的 MutableBufferSequence 引用?

这是正确的方法吗?如果是这样,我应该如何实现 async_read_some()?或者这可能不是正确的方法,我除了编写一个完整的自定义服务别无选择?

【问题讨论】:

  • 为什么不能只使用asio::windows::random_access_handle 等?看看this example
  • @IgorR。用于检索进程标准输出的匿名管道不可随机访问,因此 windows::random_access_handle 不适合我的需要。我也不能使用 windows::stream_handle,因为它不支持匿名管道(参见 here)。
  • 我在 Linux 和 Mac 上用 stream_descriptor 完成了这个,这个概念在 Windows 上不起作用吗?
  • @SamMiller:因为它位于 posix 命名空间中,我想它不是,不幸的是。
  • 我知道这已经很老了,但我设法创建了一个自定义 AsyncReadStream。你可以在这里查看github.com/raldone01/CustomAsioAsyncStreams

标签: c++ windows boost boost-asio


【解决方案1】:

通过管道的进程间通信在Boost.Process 中实现。虽然该库还不是 Boost 的一部分。

【讨论】:

    猜你喜欢
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 2019-04-07
    • 1970-01-01
    相关资源
    最近更新 更多