与boost.asio和文件I / O有什么关系?

我注意到boost.asio有很多涉及套接字,串口和各种非文件示例的例子。 对于我来说,谷歌并没有真正提到过,如果说asio是一个很好或有效的asynchronous文件I / O方法的话。

我有一些想要asynchronous写入磁盘的数据。 这可以通过在Windows(我的平台)本机重叠io来完成,但我更喜欢有一个独立于平台的解决scheme。

我很好奇

  1. boost.asio有任何forms的文件支持
  2. boost.asio文件支持对于日常文件I / O足够成熟
  3. 将文件的支持将被添加? 这是什么前景?

有boost.asio任何types的文件支持?

从(我认为)Boost 1.36(包含Asio 1.2.0)开始,你可以使用[boost :: asio ::] windows :: stream_handle或windows :: random_access_handle来包装一个HANDLE,并在其上执行asynchronous读写方法在内部使用OVERLAPPED结构。

用户Lazin也提到了可用于asynchronous操作的boost :: asio :: windows :: random_access_handle(例如命名pipe道,也包括文件)。

boost.asio文件是否支持日常文件I / O的成熟度?

由于Boost.Asio本身已被广泛使用,并且实现在内部使用重叠的IO,所以我会说是的。

将文件的支持将被添加? 这是什么前景?

由于在Asio网站上没有发现任何路线图,我想说这个function对于Boost.Asio不会有新增function。 虽然贡献者总是有机会向Boost.Asio添加代码和类。 也许你甚至可以自己贡献缺失的部分! 🙂

boost :: asio文件在Linux上的I / O

在Linux上,asio使用epoll机制来检测套接字/文件描述符是否准备好读/写。 如果您尝试在Linux上的常规文件中使用vanilla asio,则会得到“不允许操作”exception,因为epoll不支持Linux上的常规文件 。

解决方法是将asioconfiguration为在Linux上使用select机制。 你可以通过定义BOOST_ASIO_DISABLE_EPOLL来做到这BOOST_ASIO_DISABLE_EPOLL 。 如果您正在使用大量的开放式套接字,那么在这里进行的select往往比epoll慢 。 定期使用open()打开文件,然后将文件描述符传递给boost::asio::posix::stream_descriptor

boost :: asio文件在Windows上的I / O

在Windows上,您可以使用boost::asio::windows::object_handle来包装从文件操作创build的Handle 。 看例子 。

boost :: asio :: windows :: random_access_handle是最简单的方法,如果你需要高级的东西,例如asynchronous的LockFileEx或其他东西,你可以扩展asio,添加你自己的asynchronous事件。 例

ASIO支持Windows上重叠的I / O,支持良好。 在Unix上这个想法停滞不前,因为:

  • 文件通常位于同一个物理设备上,顺序访问它们是最好的select。
  • 文件请求经常以非常快的速度完成,因为它们在物理上靠近
  • 文件通常是完成程序基本操作的关键(例如,在进行初始化之前,必须在其configuration文件中进行读取)

一个常见的例外是直接向套接字提供文件。 这是一个常见的特例,Linux有一个内核函数来处理这个问题。 再次否定使用asynchronous文件I / O的原因。

简而言之:ASIO似乎反映了底层操作系统的devise理念,大多数Unix开发人员忽略了重叠的I / O,所以在该平台上不支持。

Linux有一个asio库,这个工作不比Windows API更难使用(我用过)。 两套操作系统都实现相同的概念架构。 他们的细节与编写一个好的库相关的细节有所不同,但不是两个操作系统平台(我已经使用过)的共同接口。

基本上,所有的Async File I / O都遵循“Fry Cook”架构。 这里是我的意思在一个阅读操作的上下文:我(处理线程)去一个快餐柜台(OS),并要求一个芝士汉堡(一些数据)。 它给了我一张我的订单券(一些数据结构)的副本,并在厨师(内核和文件系统)的后面发出一张票来煮我的汉堡。 然后,我坐下来或读我的电话(做其他工作)。 后来,有人宣布我的汉堡已经准备好了(向处理线程发出一个信号),并且收集我的食物(读取缓冲区)。