说明

fsync()将文件描述符fd引用的文件的所有修改后的核心数据(即,针对该文件的修改的缓冲区高速缓存页)传输("刷新")到磁盘设备(或其他永久存储设备),以便所有更改的信息即使系统崩溃或重新启动也可以检索。这包括通过磁盘高速缓存进行写入或刷新(如果存在)。呼叫将阻塞,直到设备报告传输已完成。

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

调用fsync()不一定确保包含文件的目录中的条目也已到达磁盘。为此,还需要在目录的文件描述符上使用显式的fsync()。

fdatasync()与fsync()类似,但是不会刷新已修改的元数据,除非需要该元数据才能正确处理后续的数据检索。例如,对st_atime或st_mtime的更改(分别是上次访问的时间和上次修改的时间;请参见inode(7))不需要刷新,因为它们对于正确处理后续读取的数据不是必需的。另一方面,文件大小的更改(如ftruncate(2)所示,为st_size)将需要刷新元数据。

fdatasync()的目的是减少不需要将所有元数据与磁盘同步的应用程序的磁盘活动。

语法

#包括

int fsync(int fd);

int fdatasync(int fd);

glibc的功能测试宏要求(请参阅feature_test_macros(7)):

fsync():
Glibc 2.16及更高版本:
无需定义功能测试宏
Glibc达到并包括2.15:
_BSD_SOURCE _XOPEN_SOURCE
|| / 自glibc 2.8起:/ _POSIX_C_SOURCE> = 200112L
fdatasync():
_POSIX_C_SOURCE> ='199309L _XOPEN_SOURCE> = 500

备注

在某些UNIX系统(而不是Linux)上,fd必须是可写文件描述符。

在Linux 2.2和更早版本中,fdatasync()等效于fsync(),因此没有性能优势。

旧内核和较少使用的文件系统中的fsync()实现不知道如何刷新磁盘缓存。在这些情况下,需要使用hdparm(8)或sdparm(8)禁用磁盘缓存,以确保安全操作。

返回值

成功时,这些系统调用将返回零。如果出错,则返回-1,并正确设置errno。

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

错误说明

EBADF
fd不是有效的打开文件描述符。
EIO
同步期间发生错误。此错误可能与写入同一文件上某个其他文件描述符的数据有关。从Linux 4.13开始,回写错误将报告给所有可能已写入触发错误的数据的文件描述符。某些文件系统(例如NFS)会密切跟踪哪些数据来自哪个文件描述符,并提供更精确的报告。其他文件系统(例如,大多数本地文件系统)将向记录错误时在文件上打开的所有文件描述符报告错误。
ENOSPC
同步时磁盘空间已用完。
EROFS, EINVAL
fd绑定到一个不支持同步的特殊文件(例如,管道,FIFO或套接字)。
ENOSPC, EDQUOT
fd绑定到NFS或另一个在write(2)系统调用时未分配空间的文件系统上的文件,并且由于存储空间不足,先前的某些写入操作失败。
FSYNC - Linux手册页

Linux程序员手册 第2部分
更新日期: 2020-06-09

遵循规范

POSIX.1-2001,POSIX.1-2008、4.3BSD。

在可以使用fdatasync()的POSIX系统上,将_POSIX_SYNCHRONIZED_IO定义为大于0的值。(另请参见sysconf(3)。)

名称

fsync,fdatasync-将文件的核心状态与存储设备同步

另外参见

sync(1),bdflush(2),open(2),posix_fadvise(2),pwritev(2),sync(2),sync_file_range(2),fflush(3),fileno(3),hdparm(8),坐骑(8)

日期:2019-08-20 17:58:42 来源:oir作者:oir