【问题标题】:does ofstream::close() call sync on linux?ofstream::close() 在 linux 上调用同步吗?
【发布时间】:2020-06-17 14:50:06
【问题描述】:

回复这个问题:Does close() call fsync() on Linux?

这个问题描述了 close() (c lib) 在 linux 上不调用同步。

fstream::close() 也一样吗?:

http://www.cplusplus.com/reference/fstream/fstream/close/ 建议将所有剩余字节写入文件。我观察到(罕见的)情况,我完成将 2-3KB 的块写入文件,调用 fs.close() 然后尝试打开它并且打开失败。添加一个短暂的延迟和/或调用同步似乎可以解决这个问题。

所以我想我已经回答了我自己的问题,但是 std::fstream::close() 描述让我感到困惑

【问题讨论】:

  • AFAIK sync 不应该影响这一点。我认为您应该在别处寻找问题的原因。
  • 打开失败是什么意思?失败了怎么办? fsync 与将数据刷新到文件无关,但会导致将数据写入底层设备。
  • @StaceyGirl 失败,如:std::ifstream ifs {filename, in | binary}; if (!ifs) {...fail...} 我在关闭它并写入所有数据后立即运行它。
  • @code_fodder 它不应该失败。无论你在做什么,它都与syncfsync 等无关。除非它涉及一些故障的网络存储或在 Linux 子系统下运行 Windows 或类似的东西。
  • @StaceyGirl 我在 ubuntu VM 上看到过一次,但大多数情况下我看到它在 jenkins 测试环境中的 linux 上运行。但它很少见。我真正在做的就是写入一个 ofstream 并使用 ifstream 回读——简单的东西。下面的答案表明它可能是一个问题......

标签: c++ linux fstream


【解决方案1】:

它可能取决于库的实现,但对于常见的,它不是。在 ccpreference 中写入的内容意味着 内部流缓冲区 在关闭之前写入任何未决字节。但它不会请求 os 文件系统驱动程序强制立即写入磁盘设备。

【讨论】:

  • 啊,好吧 - 有道理 - 这听起来类似于 c 风格的 close() 然后 - 我猜它们在引擎盖下大致相同。因此,如果您正在写入文件并关闭它,并且您知道要立即再次从中读取,可能需要调用 linux OS 同步?
  • @code_fodder:不应该是必需的。关闭文件后,您应该能够立即重新打开它。如果您在那里遇到问题,那实际上是一个完全不同的问题。
  • 是的,我刚刚意识到(并在主评论块中评论)正如你所说,这个问题有答案谢谢:)
【解决方案2】:

ofstream::close() 是否调用同步...

它将刷新流内部的缓冲区,然后关闭它。是否调用了类似于 syncfsync 的东西是未指定的。

...在 Linux 上?

这取决于实施。因此,它可能取决于您使用的标准库实现。如果您使用开源的,您可以查看源代码以了解它的作用。

【讨论】:

  • 我在 ubuntu 上使用 gcc 库。我不认为我在那里有可用的资源,但我相信我可以查到,谢谢:)
  • @code_fodder 源代码在 gcc-${version}-source 包中。它们也位于 Internet 上的几个可公开访问的存储库中。
  • 我查看了源代码。它确实调用了自己的“sync()”函数,但这只是完成了对文件的写入(据我所知——在读取 std 库时并不那么好)。所以我认为它不会在操作系统级别进行同步。感谢源代码的提示:)
猜你喜欢
  • 2013-02-27
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
相关资源
最近更新 更多