【问题标题】:What is the difference between fsync and syncfs?fsync 和 syncfs 有什么区别?
【发布时间】:2023-03-07 12:37:01
【问题描述】:

fsync 和 syncfs 有什么区别?

int syncfs(int fd);
int fsync(int fd);

fync 的手册页说明如下:

fsync() 传输(“刷新”)所有修改过的内核数据(即修改过的缓冲区缓存页) for) 文件描述符 fd 引用的文件到磁盘设备(或其他永久存储) 年龄设备),以便即使在系统崩溃或 被重新启动。这包括写入或刷新磁盘缓存(如果存在)。通话 阻塞,直到设备报告传输已完成。它还刷新元数据 与文件相关的信息(参见 stat(2))。

syncfs 的手册页说明如下:

sync() 导致对文件元数据和数据的所有缓冲修改写入底层- 文件系统。

syncfs() 类似于 sync(),但只同步包含由 打开文件描述符 fd。

对我来说,两者似乎是平等的。他们正在同步文件描述符和相关元数据引用的文件。

【问题讨论】:

    标签: c linux filesystems posix unistd.h


    【解决方案1】:

    首先,fsync()(和 sync())是 POSIX 标准函数,而 syncfs() 仅适用于 Linux。

    所以可用性是一大区别。

    来自POSIX standard for fsync()

    fsync() 函数应要求打开文件的所有数据 由fildes 命名的描述符将被传输到存储 与fildes 描述的文件关联的设备。的性质 传输是实现定义的。 fsync() 函数应 直到系统完成该操作或直到 检测到错误。

    请注意,这只是一个请求。

    来自the POSIX standard for sync()

    sync() 函数将导致内存中的所有信息 将文件系统更新为计划写入到所有文件 系统。

    写作虽然有计划,但不一定完成 从sync()返回。

    再说一次,这不是一定会发生的事情。

    The Linux man page for syncfs() (and sync()) states

    sync() 导致对文件系统元数据和 缓存文件数据写入底层文件系统。

    syncfs() 类似于sync(),但只同步文件系统 包含由打开的文件描述符 fd 引用的文件。

    请注意,何时函数返回是未指定的。

    The Linux man page for fsync() states:

    fsync() 传输(“刷新”)所有已修改的内核数据(即 修改的缓冲区缓存页用于)文件所引用的文件 描述符fd 到磁盘设备(或其他永久存储设备) 这样即使系统 崩溃或重新启动。这包括写入或刷新 磁盘缓存(如果存在)。呼叫阻塞,直到设备报告 传输已完成。

    除了刷新文件数据,fsync() 还刷新元数据 与文件相关的信息(参见 inode(7))。

    调用fsync() 并不一定能确保 包含该文件的目录也已到达磁盘。为此 在目录的文件描述符上显式 fsync() 也是 需要。

    请注意,Linux 为fsync() 提供的保证比为sync()syncfs() 提供的保证要强得多,而POSIX 为fsync()sync() 提供的保证要强得多。

    总结:

    1. POSIX fsync(): "请将此文件的数据写入磁盘"
    2. POSIX sync():“当你有空时将所有数据写入磁盘”
    3. Linux sync():“将所有数据写入磁盘(什么时候开始?)”
    4. Linux syncfs():“将与此文件关联的文件系统的所有数据写入磁盘(当您处理它时?)”
    5. Linux fsync():“将此文件的所有数据和元数据写入磁盘,直到完成后才返回”

    请注意,Linux 手册页没有指定 sync()syncfs() 何时返回。

    【讨论】:

    • fsync和syncfs的区别请看stackoverflow.com/questions/20708941/…
    • 似乎连Linux fsync()都有一个警告,即使函数返回成功,也有可能发生了错误,没有写入数据。如此处所述lwn.net/Articles/752063
    • 我认为您摘要中的#3 是不正确的。请参阅@user869887 关于sync(2) 的回答,它指定Linux 确实等待I/O 完成(man7.org/linux/man-pages/man2/sync.2.html)。除非有一些我不理解的区别?
    • @GeminiDakota 该手册页指出“sync() 总是成功的。”如果总是成功,则不能等待 I/O 完成。
    【解决方案2】:

    我认为当前的答案并不完整。对于 Linux:

    根据标准规范(例如,POSIX.1-2001),sync() 安排写入,但可能在实际写入之前返回 完毕。然而,Linux 等待 I/O 完成,因此 sync()syncfs() 提供与在每个文件上调用的 fsync 相同的保证 分别在系统或文件系统中。

    在 1.3.20 版本之前,Linux 之前没有等待 I/O 完成 回来了。

    sync(2) page 在“注释”和“错误”部分中提到了这一点。

    【讨论】:

    • 你是对的。人,赞成票在哪里?
    猜你喜欢
    • 2021-04-25
    • 2011-01-21
    • 2017-05-13
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    相关资源
    最近更新 更多