一般的unix系统实现在内核中都会设有缓冲区高速缓冲或页高速缓存。当我们从磁盘读取文件时,一般都会设置一个缓冲区,先把文件内容读取到缓冲区中,然后再从该缓冲区中读取内容。把数据写入磁盘文件时也是一样,一般都会先把数据缓存到缓存区,然后由内核启动的一个进程来定时(一般是30秒)地把内容写入到磁盘中。
而在 unix 中有这三个函数影响到文件的写入操作。下面介绍这三个函数的区别:
1. 函数原型
#include<unistd.h>
void sync(void);
int fsync(int fd);
int fdatasync(int fd);
返回值:若成功,返回0;若出错,返回-1
2. 区别
(1). sync 函数只是将修改过的块缓存区排入写队列,然后就返回。并不等待实际写入磁盘。
(2). fsync 指定某个文件描述符 fd指定的一个文件起作用,然后等待数据写入磁盘才返回。这种性质一般用于数据库的更新。
(3). fdatasync 函数类似于 fsync, 但它只影响到文件的数据。而 fsync 会更新文件的数据和属性(比如说文件的更新时间等文件属性)。
3. 总结
根据这三个函数的特征,一般来说当你的应用无需延迟 异步,数据的实时性要求没那么高,最终只要数据一致性就可以时,调用 sync 就可以来。而 当对数据的实时性要求比较高时,可采用 fsync 同步更新数据。