1

我有一段遗留代码在调用以确定目标文件的文件大小fsync之前发出调用。fstat(特别是代码只是从 stat 结构中访问 st_size 。)

看过文档后,我不认为这是一个必要的电话,但我想要专家的意见。

4

1 回答 1

1

在正确实现的文件系统上,发出调用fsyncfdatasync不应影响任何后续调用的结果stat//调用fstatlstat它的唯一效果应该是任何未刷新的写入,以及在 的情况下fsync,任何修改的元数据都将提交到永久存储。stat无论实际数据是否已进入永久存储,它的变体都可以很好地处理缓存写入。

也就是说fstat,您正在研究的代码段中是否需要是语义问题,取决于如何使用结果fstat。例如:

  • 如果由于fsync需要调用才能获得当前元数据的误解而使用它stat,那么您可能可以将其删除。

  • 如果它用于例如写入某种检查点数据,那么它并不是完全不相关的,尽管调用顺序可能需要颠倒 - 对于一个不断增长的文件,检查点数据需要指示文件中肯定已经完成的部分永久存储,因此调用fstat然后调用fsync* 然后写入检查点信息是有意义的。

  • 如果它被用作 I/O 绑定操作的某种 UI 进度监视器,那么显示实际提交到磁盘的数据量可能是有意义的。但是,在这种情况下,监视器的精度并不重要,因此调用顺序可能没那么重要。

那么,在您的案例中使用结果如何?fstat

免责声明:可能存在文件系统实现,例如网络/分布式实现,其中调用fsync可能会更新文件的本地客户端元数据缓存。在那种情况下,该fsync调用确实可以提高代码的可靠性。但是,如果是这种情况,那么您可能会遇到比性能问题更严重的问题...

于 2013-02-15T17:47:23.190 回答