c语言libc库自带的fflush和linux的sync、fsync、fdatasync,字面上都是刷新缓冲区数据到磁盘(当然,fflush还可以刷新缓冲区数据到标准输入、输出以及错误输出)。下面就分析一下上面提到的四个函数的区别。
一、c语言fflush和linux的sync、fsync、fdatasync的区别
1.接口基本不同
-
fflush是libc库中提供的函数,平台无关,只有在你使用到c语言的标准文件(FILE)操作时,才涉及fflush。
-
sync、fsync、fdatasync是系统提供的系统调,平台相关。
2.原形
-
fflush接受一个参数FILE *.
fflush(FILE *); -
sync、fsync、fdatasync的函数原型如下(fd表示文件描述符)。
sync();
fsync(int fd);
fdatasync(int fd);
3.功能
-
fflush:
是把C语言FILE的缓冲区中要写入文件的内容刷到操作系统的写入缓冲区中(其实是写到内核的缓冲区,即 页高速缓存)。注意:FILE的缓冲区实际就是libc库在用户空间的栈上申请的一块内存。 -
sync、fsync、fdatasync:是把内核的缓冲区(即 页高速缓存)中要写到磁盘中的数据刷到磁盘上。
下面引用一个比较形象的流程示例:
FILE缓冲-----fflush---------〉内核缓冲--------fsync-----〉磁盘
二、sync、fsync、fdatasync之间的区别
传统的UNIX系统在内核中设有页高速缓存,磁盘I/O的数据一般都通过这个缓存区。(所有增加缓存的目的显然都是协调两个速度不匹配的操作或者设备,这样就会很大程度缓解慢设备对快设备的拖累。)当我们向文件写入数据时,内核通常会先将数据复制到页告诉缓存中,然后将这些缓存页的地址排入队列,晚些时候再写入磁盘。这种方式被称为延迟写。
1、sync和fsync、fdatasync的区别
-
sync只是将页高速缓存中所有修改过的块的地址排入写入队列,然后返回,他并不等待实际写磁盘操作结束。
-
fsync、fdatasync只对参数fd指定的一个文件起作用,并且等到写磁盘结束才返回。
这两个系统调用一般用于数据库这样的应用程序,这种应用需要确保修改过的块立即写到磁盘上。
2、fsync和fdatasync的区别
-
fsync不仅会讲数据写入磁盘上文件的数据(data)部分,还会将要更改的文件属性也刷到磁盘上的文件元数据(inode)部分。
-
fdatasync只影响文件的数据部分。