【问题标题】:Does close() call fsync() on Linux? [duplicate]在 Linux 上 close() 会调用 fsync() 吗? [复制]
【发布时间】:2013-02-27 05:03:26
【问题描述】:

当我们调用close(<fd>) 时,它会自动执行fsync() 以同步到物理媒体吗?

【问题讨论】:

    标签: c linux unix


    【解决方案1】:

    它没有。调用 close() 并不能保证内容在磁盘上,因为操作系统可能推迟了写入。

    附带说明,请始终检查close() 的返回值。它会让你知道到那时为止的任何延迟错误。如果您想确保内容在磁盘上,请始终调用fsync() 并检查其返回值。

    要记住的一件事是后备存储是什么。有些设备可能会进行内部写入延迟,并且在某些情况下可能会丢失内容(尽管较新的存储媒体设备通常具有超级电容器来防止这种情况,或者禁用此功能的方法)。

    【讨论】:

    • 调用fsync() 也不行,原因相同(硬件可能推迟了写入)。
    • @FrédéricHamidi fsync() 强制写入存储,在什么情况下 fsync 不能保证磁盘上的内容(除了奇怪的故障和在某些情况下无法控制的硬件延迟写入)?
    • 磁盘控制器中可能(并且通常是)另一层缓存,因此即使fsync() 也无法保证您的数据已到达实际硬件。 close()man page 确实提到了这一点。
    • @FrédéricHamidi:fsync,顾名思义,将数据提交到稳定存储。如果不是,那么您的系统不符合 POSIX 标准(即错误)。是的,世界上有许多错误的系统,是的,其中许多系统运行 Linux,但这并不会使这个答案无效,这是完全正确的。
    • @Nemo,我的第一条评论起源于这个答案只包含在第一段中的时候。从那以后情况发生了变化,但我同意这是有效的,并且从未说过其他话。
    【解决方案2】:

    没有。

    来自man 2 close

    成功关闭并不能保证数据已被 成功保存到磁盘,因为内核延迟写入。它 文件系统在流关闭时刷新缓冲区并不常见。如果您需要确保数据是 物理存储使用 fsync(2)。 (此时将取决于磁盘硬件。)

    【讨论】:

      【解决方案3】:

      来自man 2 close

      成功关闭并不能保证数据已被 成功保存到磁盘,因为内核延迟写入。它不是 文件系统通常在流被刷新时刷新缓冲区 关闭。如果您需要确保数据是物理存储的,请使用 同步(2)。 (此时将取决于磁盘硬件。)

      为回答您的问题,close() 不保证fsync()

      close 只关闭进程的文件描述符并移除与进程关联的所有记录锁。

      【讨论】:

        猜你喜欢
        • 2016-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-11
        • 1970-01-01
        • 1970-01-01
        • 2015-03-30
        相关资源
        最近更新 更多