gpt4 book ai didi

c - fsync 和 syncfs 有什么区别?

转载 作者:IT王子 更新时间:2023-10-29 01:15:28 27 4
gpt4 key购买 nike

fsync 和 syncfs 有什么区别?

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

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

fsync() transfers ("flushes") all modified in-core data of (i.e., modified buffer cache pages for) the file referred to by the file descriptor fd to the disk device (or other permanent stor‐ age device) so that all changed information can be retrieved even after the system crashed or was rebooted. This includes writing through or flushing a disk cache if present. The call blocks until the device reports that the transfer has completed. It also flushes metadata information associated with the file (see stat(2)).

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

sync() causes all buffered modifications to file metadata and data to be written to the underly‐ ing filesystems.

syncfs() is like sync(), but synchronizes just the filesystem containing file referred to by the open file descriptor fd.

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

最佳答案

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

所以可用性是一个很大的区别。

来自POSIX standard for fsync() :

The fsync() function shall request that all data for the open file descriptor named by fildes is to be transferred to the storage device associated with the file described by fildes. The nature of the transfer is implementation-defined. The fsync() function shall not return until the system has completed that action or until an error is detected.

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

来自 the POSIX standard for sync() :

The sync() function shall cause all information in memory that updates file systems to be scheduled for writing out to all file systems.

The writing, although scheduled, is not necessarily complete upon return from sync().

同样,这也不是一定会发生的事情。

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

sync() causes all pending modifications to filesystem metadata and cached file data to be written to the underlying filesystems.

syncfs() is like sync(), but synchronizes just the filesystem containing file referred to by the open file descriptor fd.

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

The Linux man page for fsync() states :

fsync() transfers ("flushes") all modified in-core data of (i.e., modified buffer cache pages for) the file referred to by the file descriptor fd to the disk device (or other permanent storage device) so that all changed information can be retrieved even if the system crashes or is rebooted. This includes writing through or flushing a disk cache if present. The call blocks until the device reports that the transfer has completed.

As well as flushing the file data, fsync() also flushes the metadata information associated with the file (see inode(7)).

Calling fsync() does not necessarily ensure that the entry in the directory containing the file has also reached disk. For that an explicit fsync() on a file descriptor for the directory is also needed.

请注意,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() 何时返回。

关于c - fsync 和 syncfs 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48171855/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com