天天看点

sync,fsync,fdatasync in Linux

这三个函数用于实现磁盘数据的同步问题。

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一样,文件的属性也会被同步更新。