这三个函数用于实现磁盘数据的同步问题。
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一样,文件的属性也会被同步更新。