fsync与fflush的关系和区别
Posted “好记性不如烂“博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fsync与fflush的关系和区别相关的知识,希望对你有一定的参考价值。
read/write/fsync与fread/fwrite/fflush的关系和区别
read/write/fsync:
linux底层操作;
内核调用, 涉及到进程上下文的切换,即用户态到核心态的转换,这是个比较消耗性能的操作。
fread/fwrite/fflush:
c语言标准规定的io流操作,建立在read/write/fsync之上
在用户层, 又增加了一层缓冲机制,用于减少内核调用次数,但是增加了一次内存拷贝。
两者之间的关系,见下图:
补充:
对于输入设备,调用fsync/fflush将清空相应的缓冲区,其内数据将被丢弃;
对于输出设备或磁盘文件,fflush只能保证数据到达内核缓冲区,并不能保证数据到达物理设备, 因此应该在调用fflush后,调用fsync(fileno(stream)),确保数据存入磁盘。
————————————————————————————————
fflush函数和fsync函数对比如下:
1.fflush接受一个参数FILE *.
fflush(FILE *);
fflush是libc.a中提供的方法,是用来将流中未写的数据传送到内核。如果参数为null,将导致所有流冲洗。
fsync接受的时一个Int型的文件描述符。
fsync(int fd);
fsync是系统提供的系统调用。将数据写到磁盘上
2.fflush/fsync 功能区别
fflush:是把C库中的缓冲调用write函数写到磁盘[其实是写到内核的缓冲区]。
fsync:是把内核缓冲刷到磁盘上。
c库缓冲-----fflush---------〉内核缓冲--------fsync-----〉磁盘
进一步引申到sync()、fflush()、fsync()这3个函数的别
a、三者的用途不一样:
sync,是同步整个系统的磁盘数据的.
fsync是同步打开的一个文件到缓冲区数据到磁盘上.
fflush是刷新打开的流的.
b、同样是同步,但三者的同步等级不一样:.
sync, 将缓冲区数据写回磁盘, 保持同步.(无参数)
fsync, 将缓冲区的数据写到文件中.(有一个参数 int fd)
fflush, 将文件流里未写出的数据立刻写出
以上是关于fsync与fflush的关系和区别的主要内容,如果未能解决你的问题,请参考以下文章
`O_DIRECT | 有啥区别? O_SYNC` + write() 和 `O_DIRECT` + write() + fsync()