fsync和syncfs有什么区别?

时间:2018-01-09 15:45:50

标签: c linux filesystems posix unistd.h

fsync和syncfs有什么区别?

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

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

  

fsync()传输("刷新")所有修改后的内核数据(即修改后的缓冲区缓存页面)          for)文件描述符fd引用的文件到磁盘设备(或其他永久存储器)          年龄设备),以便即使在系统崩溃或之后也可以检索所有更改的信息          重启了。这包括写入或刷新磁盘高速缓存(如果存在)。电话          阻止,直到设备报告传输已完成。它还会刷新元数据          与文件相关的信息(见统计数据(2))。

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

  

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

     

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

对我而言,两者似乎都是平等的。它们正在同步filedescriptor引用的文件和关联的元数据。

2 个答案:

答案 0 :(得分:6)

首先,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()提供的保证要强得多

总结:

  1. POSIX fsync():"请将此文件的数据写入磁盘"
  2. POSIX sync():"当您接触到它时,将所有数据写入磁盘"
  3. Linux sync():"将所有数据写入磁盘(当你接触它时?)"
  4. Linux syncfs():"将与此文件关联的文件系统的所有数据写入磁盘(当你接触它时?)"
  5. Linux fsync():"将此文件的所有数据和元数据写入磁盘,并且在您执行之前不要返回"
  6. 请注意,Linux手册页未指定sync()syncfs()何时返回。

答案 1 :(得分:0)

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

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

在1.3.20版之前,Linux并未在I / O完成之前等待 返回。

sync(2) page的“注释”和“错误”部分中对此进行了提及。