假设我在不执行 fsync 的情况下将一个块写入文件描述符,然后稍后从同一个描述符读取同一个块。是否保证我会收到相同的信息?
该程序是单线程的,任何其他进程都不会访问该文件。
是的,它是由操作系统保证的。
即使修改尚未写入磁盘,操作系统也会使用其缓冲区缓存来反映文件修改并保证对所有进程的读取和写入的原子性级别。因此,不仅您的流程,而且任何其他流程,都能够看到更改。
至于fsync()
,它只是指示操作系统尽最大努力将内容刷新到磁盘。另请参阅fdatasync()
。
另外,我建议您使用两个文件描述符:一个用于读取,另一个用于写入。
fsync()
同步缓存和磁盘。由于数据已经在缓存中,它将从那里而不是从磁盘中读取。
当您写入文件描述符时,数据在发送到磁盘之前存储在内存缓存和缓冲区中。所以只要不关闭描述符,就可以访问刚刚写入的数据。如果您关闭描述符,文件内容必须通过自己刷新或等待操作系统执行以提高效率,但如果您想确保在打开新 FD 后访问刚刚写入磁盘上的数据,则必须将文件内容放入磁盘, 你必须用 . 刷新到磁盘fsync()
。