与boost.asio和文件i/o有什么关系?

Dou*_* T. 45 c++ file-io boost boost-asio

我注意到boost.asio有很多涉及套接字,串行端口和各种非文件示例的例子.对于我来说,Google并没有真正提到过很多,因为asio是一个很好或有效的异步文件i/o方法.

我有大量的数据我想异步写入磁盘.这可以通过Windows(我的平台)中的原生重叠io来完成,但我更喜欢拥有独立于平台的解决方案.

我好奇,如果

  1. boost.asio有任何文件支持
  2. boost.asio文件支持已经足够成熟,适用于日常文件i/o
  3. 是否会添加文件支持?这是什么前景?

viv*_*dos 18

boost.asio有什么样的文件支持吗?

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

用户Lazin还提到了可以用于异步操作的boost :: asio :: windows :: random_access_handle(例如命名管道,还有文件).

boost.asio文件是否支持日常文件i/o足够成熟?

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

是否会添加文件支持?这是什么前景?

由于在Asio网站上找不到路线图,我会说Boost.Asio没有新增功能.虽然贡献者总是有机会向Boost.Asio添加代码和类.也许你甚至可以自己贡献缺失的部分!:-)

  • 谢谢,这可能证明是有用的.您是否知道有任何实施平台无关异步文件的计划? (3认同)

moo*_*f2k 6

Linux上的boost :: asio文件i/o

在Linux上,asio使用该epoll机制来检测套接字/文件描述符是否已准备好进行读/写.如果您尝试在Linux上的常规文件上使用vanilla asio,则会出现"不允许操作"异常,因为epoll不支持Linux上的常规文件.

解决方法是配置asio以select在Linux上使用该机制.你可以通过定义来做到这一点BOOST_ASIO_DISABLE_EPOLL.如果您正在使用大量开放套接字,那么选择此处的权衡往往比epoll慢.定期打开文件open(),然后将文件描述符传递给a boost::asio::posix::stream_descriptor.

Windows上的boost :: asio文件i/o

在Windows上,您可以boost::asio::windows::object_handle用来包装Handle从文件操作创建的文件.见例子.


Ign*_*rpe 6

io_uring 改变了一切。
asio 现在支持异步文件读/写。
请参阅发行说明:
asio 1.21.0 发行说明


Evg*_*zin 5

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


uni*_*n83 5

ASIO支持Windows上支持良好的重叠I/O. 在Unix上,由于以下原因,这个想法停滞不前:

  • 文件通常位于同一物理设备上,优先顺序访问它们.
  • 文件请求通常非常快速地完成,因为它们在物理上接近.
  • 文件通常对于完成程序的基本操作至关重要(例如,必须在进一步初始化之前读取其配置文件)

一个常见的例外是将文件直接提供给套接字.这是一个常见的特殊情况,Linux有一个内核函数可以为你处理这个问题.再次,否定使用异步文件I/O的原因.

简而言之:ASIO似乎反映了底层的OS设计理念,大多数Unix开发人员忽略了重叠的I/O,因此该平台不支持它.

  • 出于好奇,你指的是什么内核功能? (2认同)