fsync和syncfs有什么区别?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fsync和syncfs有什么区别?相关的知识,希望对你有一定的参考价值。

fsync和syncfs有什么区别?

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

fync的联机帮助页说明如下:

fsync()将文件描述符fd引用的文件(即修改的缓冲区缓存页)的所有已修改的内核数据传输(“刷新”)到磁盘设备(或其他永久存储设备),以便所有即使在系统崩溃或重新启动后,也可以检索更改的信息。这包括写入或刷新磁盘高速缓存(如果存在)。呼叫将阻止,直到设备报告传输已完成。它还刷新与文件关联的元数据信息(请参阅stat(2))。

syncfs的联机帮助页说明如下:

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

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

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

答案

首先,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()提供的保证强得多,而对于fsync()sync()则提供POSIX。

综上所述:

  1. POSIX fsync():“请将此文件的数据写入磁盘”
  2. POSIX sync():“当你解决它时,将所有数据写入磁盘”
  3. Linux sync():“将所有数据写入磁盘(当你接触它时?)”
  4. Linux syncfs():“将与此文件关联的文件系统的所有数据写入磁盘(当你接触它时?)”
  5. Linux fsync():“将此文件的所有数据和元数据写入磁盘,并且在您执行之前不要返回”

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

以上是关于fsync和syncfs有什么区别?的主要内容,如果未能解决你的问题,请参考以下文章

fsync与fflush的关系和区别

fsync与fflush的关系和区别

这两个代码片段有啥区别?

技术文档 - PostgreSQL 性能优化之 fsync 参数

Linux (openwritereadcloselseekchmodsync)操作文件的函数详解

Linux (openwritereadcloselseekchmodsync)操作文件的函数详解