文件IO:sync、fsync、fdatasync、fflush
引言:可以先看 和 ,理解缓存读写方式和文件I/O,看这篇就很容易了。
一、sync、fsync、fdatasync
1.提供者fflush是libc.a中提供的方法,fsync是系统提供的系统调用。原形fflush接受一个参数FILE *.fflush(FILE *);fsync接受的时一个Int型的文件描述符。fsync(int fd);
3.功能fflush:是把C库中的缓冲调用write函数写到磁盘[其实是写到内核的缓冲区]。fsync:是把内核缓冲刷到磁盘上。
c库缓冲-----fflush---------〉内核缓冲--------fsync-----〉磁盘
Note that fflush() only flushes the user space buffers provided by the C library. To ensure that the data is physically stored on disk the kernel buffers must be flushed too.
此时还需要用到fsync 或者sync函数。
三、总结
IO缓冲层次关系
用途不一样.
sync,是同步整个系统的磁盘数据的.
fsync是同步打开的一个文件到缓冲区数据到磁盘上.
fflush是刷新打开的流的. 可以说都是同步方法.
sync 将缓冲区数据写回磁盘,保持同步.(无参数)
fsync 将缓冲区的数据写到文件中.(有一个参数 int fd)
fflush 将文件流里未写出的数据立刻写出.
参考:
linux 同步IO: sync、fsync与fdatasync, 以及在日志文件中如何使用
https://blog.csdn.net/cywosp/article/details/8767327
文件IO - O_DIRECT和O_SYNC详解
扩展阅读:
聊聊Linux IO(中)——Linux内核中的IO栈
https://blog.csdn.net/juS3Ve/article/details/82322637