fsync(2) - Linux 手册页

名称

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

概要

#include <unistd.h>

int fsync(int fd);

int fdatasync(int fd);

glibc 的功能测试宏要求(参见 feature_test_macros(7))

fsync(): _BSD_SOURCE || _XOPEN_SOURCE
|| /* 自 glibc 2.8 起:*/ _POSIX_C_SOURCE >= 200112L
fdatasync
(): _POSIX_C_SOURCE >= 199309L || _XOPEN_SOURCE >= 500

描述

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

调用 fsync() 并不能保证包含该文件的目录条目也已到达磁盘。为此,还需要对目录的文件描述符进行显式的 fsync() 调用。

fdatasync() 与 fsync() 类似,但除非为了正确处理后续数据检索而需要该元数据,否则不会刷新修改过的元数据。例如,对 st_atimest_mtime(分别是上次访问时间和上次修改时间;参见 stat(2))的更改不需要刷新,因为它们对于正确处理后续的数据读取是不必要的。另一方面,对文件大小(st_size,例如由 ftruncate(2) 更改)的更改将需要刷新元数据。

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

返回值

成功时,这些系统调用返回零。发生错误时,返回 -1,并且 errno 被设置为适当的值。

错误

EBADF

fd 不是有效的打开文件描述符。

EIO

在同步过程中发生错误。

EROFS, EINVAL
fd 绑定到不支持同步的特殊文件。

符合

4.3BSD, POSIX.1-2001。

可用性

在具有 fdatasync() 的 POSIX 系统上,<unistd.h> 中定义了 _POSIX_SYNCHRONIZED_IO,其值为大于 0 的值。(另请参见 sysconf(3))。

说明

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

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

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

参见

bdflush(2), open(2), sync(2), sync_file_range(2), hdparm(8), mount(8), sync(8), update(8)

引用自

aio(7), aio_error(3), aio_fsync(3), aio_return(3), beanstalkd(1), close(2), clubufflush(8), dbopen(3), explain(1), explain(3), explain_fsync(3), explain_fsync_or_die(3), fclose(3), fflush(3), fio(1), posix_fadvise(2), star(1), wipe(1), write(2), xfs_io(8)