fsync 或 fsync_range 子例程

用途

将文件中的更改写到永久存储器中。

标准 C 库 (libc.a)

语法

#include <unistd.h>

int fsync ( FileDescriptor)
int FileDescriptor;

int fsync_range (FileDescriptor, how, start, length)
int FileDescriptor;
int how;
off_t start;
off_t length;

描述

fsync 子例程使由 FileDescriptor 参数指定的打开文件中的所有修改后的数据保存到永久存储器。 从 Fsync 子例程返回时,所有更新都已保存在永久存储器上。

fsync_range 子例程导致将 FileDescriptor 参数指定的打开文件的指定范围内的所有修改后的数据保存到永久存储器。 从 fsync_range 子例程返回时,指定范围内的所有更新都已保存在永久存储器上。

此段引用了仅在 JFS 文件系统中可用的不推荐使用的功能。 直到另一个进程对此文件发出 fsync_range Fsync 调用,或者在此文件上运行同步 子例程 (带有 O_SYNC 标志) 之后,才会将写入进程为延迟更新而打开的文件 (带有 0-DEFER 标志) 的数据写入永久存储器。 请参阅 fcntl.h 文件和 open 子例程,以分别获取 O_延迟 O_SYNC 标志的描述。

注: 当发出 fsync 子例程或调用失败时,必须打开由 FileDescriptor 参数标识的文件以进行写入。 在 BSD 系统中未强制实施此限制。 fsync_range 子例程不需要写访问权。

参数

描述
FileDescriptor 有效的打开文件描述符。
如何 指定该操作的处理特征。
O_SYNC
<start, length> 参数指定的范围内的已修改数据将写入存储器。 如果修改了任何元数据,那么所有修改后的用户数据都将写入存储器。 任何元数据更改和文件属性 (包括时间戳记) 也会写入存储器。
O_DSYNC
<start, length> 参数指定的范围内的已修改数据将写入存储器。 如果文件有修改后的元数据,那么如果需要读取数据,那么也会写入元数据。 否则,不会进行元数据更新。
0-无高速缓存
修改后的数据将与 O_DSYNC 参数一样写入。 <start, length> 参数指定的范围内的完整页将从内存高速缓存中除去。 即使未修改这些页面,也会从高速缓存中除去这些页面。 该操作还适用于仅为读取而打开的文件。
启动 正在启动文件偏移量。
长度 所有高速缓存数据的长度或为零。

返回值

成功完成后, Fsync 子例程将返回值 0。 否则,返回值为-1,并设置errno全局变量来指示错误。

成功完成后, fsync_range 子例程将返回值 0。 否则,返回值为-1,并设置errno全局变量来指示错误。

错误代码

如果以下一个或多个条件成立,那么 Fsyncfsync_range 子例程不成功:

描述
EIO 从文件系统读取或写入文件系统时发生 I/O 错误。
EBADF FileDescriptor 参数不是打开用于写入的有效文件描述符。
EINVAL 该文件不是一个常规文件。
EINTR 该子例程被信号中断。