这三个函数用于实现磁盘数据的同步问题。
Unix操作系统在大部分磁盘(disl)IO操作的时候在内核使用了buffer cache or page cache。当我们向文件写入数据的时候,数据经常被内核复制到缓冲区中,排队地等待被写入disk(磁盘)。这被称为
delayed write
(延迟写入)。通常当内核需要将
buffer
用于其他磁盘块的时候,会将所有延迟写入的数据全部写入到disk(磁盘)中去。为了确保disk上的文件系统和buffer cache内容的一致性。系统提供了
sync
,
fsync
,
fdatasync
这些函数。
函数原型如下:
#include <unistd.h>
int fsync(int fd);
int fdatasync(int fd);
//Returns: 0 if OK, -1 on error
void sync(void);
sync
其简单的将所有用于写入已经被修改的块(modified block)排列起来。
sync
不等待磁盘写入操作的发生。(disk writes to take place).
sync通常被系统守护程序(system daemon)周期性调用(约30秒),被称之为
update
,这能确保内核
block buffers
的周期性flush。命令
sync(1)
也能调用
sync
函数。
fsync
fsync
仅仅适用于单个文件(由fd指定的文件),然后等待磁盘写入操作的完成才返回。
fsync
在应用程序中可以被用在
database
(数据库)上,因为数据库需要确保修改的数据已经写入到了刺盘中
fdatasync
fdatasync类似于fsync,只是仅仅影响文件的数据区域。和fsync一样,文件的属性也会被同步更新。