我定期从文件中读取并检查读数以决定后续操作。由于这个文件可能被一些绕过Linux内核中的块文件I / O操作层的机制修改,我需要确保读取操作从真实底层设备而不是内核缓冲区读取数据。
我知道fsync()可以确保所有I / O写操作都已完成,所有数据都写入实际设备,但不是I / O读操作。
文件必须保持打开状态。
所以有人可以请你告诉我如何在Linux系统中满足这样的要求?是否有类似于fsync()的API可以调用?
真的很感谢你的帮助!
答案 0 :(得分:3)
我相信你想使用O_DIRECT标志open()
。
答案 1 :(得分:1)
我认为与madvise()和/或posix_fadvise()结合使用的内存映射应满足您的要求...... Linus将其与http://kerneltrap.org/node/7563处的O_DIRECT进行对比; - )。
答案 2 :(得分:0)
如果另一台设备与内核同时写入块设备,则会遇到麻烦。
内核假定块设备不会被其他任何一方写入。即使文件系统以只读方式挂载,也是如此。
即使您使用直接IO,内核也可能会缓存文件系统元数据,因此更改文件块的位置可能会导致错误行为。
所以简而言之 - 不要这样做。
如果您愿意,您可以直接访问块设备 - 这可能是一个更成功的方案,但仍然可能允许有害的竞争条件(您无法保证其他设备的元数据和数据更新的顺序)。这些可能会导致您最终从设备中读取垃圾(如果元数据在数据之前更新)。在这种情况下,你最好有一种检测垃圾读取的机制。
我当然是假设一些非常简单的脑死亡文件系统,如FAT。这可能合理地在用户空间中实现(例如,mtools)