代码之家  ›  专栏  ›  技术社区  ›  Doug T.

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

  •  41
  • Doug T.  · 技术社区  · 15 年前

    我注意到boost.asio有很多例子,包括套接字、串口和各种非文件的例子。对于我来说,Google并没有太多提到asio是否是一种好的或有效的异步文件i/o方法。

    我有大量数据要异步写入磁盘。这可以通过Windows(我的平台)中的本机重叠io来实现,但我更喜欢采用独立于平台的解决方案。

    1. boost.asio具有任何类型的文件支持
    2. boost.asio文件支持对于日常文件i/o来说已经足够成熟
    5 回复  |  直到 7 年前
        1
  •  20
  •   vividos    11 年前

    boost.asio有任何类型的文件支持吗?

    从(我认为)Boost 1.36(包含Asio 1.2.0)开始,您可以使用[Boost::Asio::]windows::stream\u句柄或windows::random\u access\u句柄包装句柄,并在其上执行异步读写方法,这些方法在内部使用重叠结构。

    用户Lazin还提到boost::asio::windows::random\u access\u句柄,可用于异步操作(例如命名管道,但也包括文件)。

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

    由于Boost.Asio本身目前已被广泛使用,而且实现在内部使用了重叠IO,我想说是的。

    因为在地图上找不到路线图 Asio 我想说的是,对于这个功能,Boost.Asio不会有新的添加。尽管贡献者总是有机会向Boost.Asio添加代码和类。也许你甚至可以自己贡献缺失的部分!:-)

        2
  •  7
  •   Community Egal    7 年前

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

    在Linux上,asio使用 epoll 检测套接字/文件描述符是否准备好读/写的机制。如果您试图在Linux上的常规文件上使用vanilla asio,您将得到一个“不允许操作”异常,因为 epoll does not support regular files on Linux .

    解决方法是将asio配置为使用 select Linux上的机制。您可以通过定义 BOOST_ASIO_DISABLE_EPOLL select tends to be slower than epoll 如果您使用的是大量打开的插座。使用定期打开文件 open() 然后将文件描述符传递给 boost::asio::posix::stream_descriptor .

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

    在Windows上,您可以使用 boost::asio::windows::object_handle Handle 它是通过文件操作创建的。看见 example .

        3
  •  5
  •   Evgeny Lazin    15 年前
        4
  •  4
  •   unixman83    12 年前

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

    • 文件通常位于同一物理设备上,最好按顺序访问它们。
    • 文件请求通常很快完成,因为它们在物理上很接近。
    • 文件通常是完成程序基本操作的关键(例如,在进一步初始化之前必须读取其配置文件)

    核函数 这是为你处理的。再次否定使用异步文件I/O的原因。

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

        5
  •  0
  •   Zack Yezek    11 年前

    Linux有一个asio库,在这项工作中使用它并不比使用Windows API困难(我曾经使用过它)。两套操作系统都实现了相同的概念体系结构。它们在编写一个好的库的相关细节上有所不同,但并不是说两种操作系统平台都不能有一个通用接口(我用过一个)。

    基本上,所有类型的异步文件I/O都遵循“Fry-Cook”体系结构。以下是我在阅读操作上下文中的意思:我(处理线程)去快餐柜台(OS)要一个奶酪汉堡(一些数据)。它给了我一份订购单(一些数据结构)的副本,并在后面向cook(内核和文件系统)发出一份订购单来烹饪我的汉堡。然后我坐下来或看我的手机(做其他工作)。后来,有人宣布我的汉堡准备好了(向处理线程发送信号),我收集食物(读取缓冲区)。

        6
  •  0
  •   Ignacio Sharpe    2 年前

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