fwrite实现原理:
FILE有三种缓存模式,
1.全缓冲
2.无缓冲
3.先缓冲
默认为全缓冲,在第一次fwrite数据时会创建缓冲区,通过fstat方法,获取fd对应的文件系统的block size即st.st_blksize,如果为空,则使用默认的BUFSIZ==1024。
实际测试block size,
Linux 文件系统的block size为4196。
小tf卡的block size为8192
U盘block size为8192,sd卡通过读卡器挂载,block size为16384
全缓冲模式
如果C Buffer已经脏了一部分,就先拷贝一部分数据到C缓存,填满C缓存后,调用write写入数据,然后判断剩下数据是否大于C buffer的大小,如果是就直接调用write。
如果剩下数据小于C buffer的缓存,就拷贝进去。
所以正常情况下,数据大小小于C buffer size,就会循环填充C Buffer,填满之后就调用write写数据。
无缓存模式
循环调用write写数据,每次写1024大小数据,直到写完
每次写 BUFSIZ大小的数据,直到写完。
fflush实现原理:
将C Buffer中缓存的数据调用write一次性写入,如果没有一次性写完,会循环write直到写完。