C++ 如何使用Boost';s'mapped_file_sink'类?

C++ 如何使用Boost';s'mapped_file_sink'类?,c++,boost,boost-iostreams,C++,Boost,Boost Iostreams,使用Boost库和中的类 我想将写入的数据刷新到磁盘,但没有映射的文件\u sink::flush()成员函数 我的问题是: 使用映射文件\u接收器时如何刷新写入的数据 如果上述操作无法完成,那么考虑到可移植的实现,为什么不呢 如果您在查看建议的Boost.AFIO v2的映射文件支持,您会注意到还缺乏刷新映射文件视图的能力 原因是,当映射视图在各个方面与该文件的页面缓存缓冲区相同时,它在现代统一页面缓存内核中是多余的msync()对这样的内核是不可操作的,因为脏页已经排队等待在系统认为合适时

使用Boost库和中的类

我想将写入的数据刷新到磁盘,但没有
映射的文件\u sink::flush()
成员函数

我的问题是:

  • 使用
    映射文件\u接收器时如何刷新写入的数据
  • 如果上述操作无法完成,那么考虑到可移植的实现,为什么不呢

如果您在查看建议的Boost.AFIO v2的映射文件支持,您会注意到还缺乏刷新映射文件视图的能力

原因是,当映射视图在各个方面与该文件的页面缓存缓冲区相同时,它在现代统一页面缓存内核中是多余的<因此,code>msync()
对这样的内核是不可操作的,因为脏页已经排队等待在系统认为合适时写入存储。您可以使用good old
fsync()
阻止进程,直到系统完成该文件所有脏页的写入

如果(a)您的内核不是统一的页面缓存设计(QNX、NetBSD等),或者(b)您的文件位于网络文件系统上,则上述所有内容均不适用。如果您处于(a)种情况,最好是完全避免内存映射i/o,只需执行
read()
write()
,它们在OSs中所占的比例非常小,这让它们的性能很差。对于(b)种情况,您非常不愿意在网络文件系统中使用内存映射i/o。有一个论点认为只读映射只是不可变文件,否则除非你知道你在做什么,否则就不要这样做。回到
read()
write()
,这样更安全,也不太可能让人吃惊


最后,您链接到一个安全的文件删除程序。由于延迟的数据块分配或写时拷贝分配,这些程序在最近的文件系统中不再可靠地工作。换句话说,当您重写现有文件的一部分时,它不会修改存储上的原始数据,而是实际分配新存储,并将文件的扩展数据块列表指向新的链接列表。这允许在意外数据丢失后轻松恢复一致的文件系统。要安全地删除最近文件系统上的数据,通常需要使用特殊的操作系统API,尽管删除所有文件然后用随机数据填充可用空间可能会在大多数情况下安全地删除大部分有问题的数据。注意:在下一次触发垃圾收集例程或删除快照之前,写时复制归档系统可能会在数天或数周内将释放的扩展数据块释放回可用空间池以进行新的分配。在这种情况下,用随机性填充可用空间不会安全地删除有问题的文件。如果所有这些都是问题,请使用FAT32作为您的归档系统,这非常简单,在FAT32上重写数据确实会在存储上重写相同的数据(不过请注意,某些存储介质(例如SSD)很可能也不会重写数据,这些介质也会在以后写入对新存储的修改和垃圾收集释放的数据块).

我希望我能留在高层,尽管之前的消息暗示我不能。谢谢你的回答:我通常不“接受”单一的答案,因为它似乎没有必要;不过,既然你被一个不知名的人否决了,我也可以这么做。毫无疑问,boost-dev是我众多粉丝中的一个。我在这里回复了我的回复后不久,它就被否决了。据我所知,最接近的便携式安全删除算法是删除所有您想要删除的文件,创建一个填满所有可用空间的文件,然后如果您的设备支持TRIM simply fsync,则删除该文件。如果不支持修剪,请使用零、fsync填充,然后删除。这应该可以在大多数时间安全地删除大部分数据,而且在具有微调功能的设备上,删除速度也相当快。谢谢你的回答。