我正在学习Linux下的文件操作调用。read()
和许多其他功能使用缓存write()
来提高性能,我知道fsync()
可以将数据从缓存传输到磁盘设备。
但是,是否有任何命令或系统调用可以确定数据是否被缓存或写入磁盘?
答案1
仅当数据已经存在时,才从缓存中(直接)读取读取数据。这意味着缓存的数据先前已被进程访问并保存在缓存中。没有系统调用或任何方法可以让进程知道要读取的某些数据是否已经在缓存中。
另一方面,进程可以选择是否希望写入的数据立即存储在磁盘上,或者仅在可变延迟之后(这是一般情况)。这是通过在打开文件时使用 O_SYNC 标志来完成的。
还有 O_DIRECT 标志,当支持时,它会强制所有 I/O 绕过读写缓存并直接访问磁盘。
最后,硬盘本身可以自由地实现自己的缓存,因此即使在同步写入调用返回后,也不能保证数据已经在磁盘盘片上。
答案2
fsync
已经对有问题的文件执行此操作(写入磁盘),但它不保证对目录执行此操作。这需要额外的 fsync 调用。