文件I/0缓冲
设置stdio流缓冲模式
#include<stdio.h>
int setvbuf(FILE *stream,char *buf,int mode,size_t size)
int setbuf(FILE *stream,char *buf)//该函数不返回函数结果
int setbuffer(FILE *stream,char *buf,size_t size)//类似setbuf函数只是允许指定缓冲区大小
其中mode的值可为
_IONBF不进行缓冲直接读写
_IOLBF进行行缓冲
_IOFBF进行全缓冲
调用函数出错返回非零值
刷新stdio缓冲区
int fflush(FILE *stream) //刷新到内核缓冲区,若参数为NULL,刷新全部缓冲区
用于控制文件I/O内核缓冲的系统调用
#include<stdio.h>
int fsync(int fd)//所有元数据刷新到磁盘
int fdatasync(int fd)//只刷新数据到磁盘,元数据不刷新(例如最近更改时间等等属性)
void sync(void) //刷新所有数据(包括数据块,元数据等)
混合使用库函数和系统调用进行文件I/O
int fileno(FILE *stream)//该函数用于获取文件流相对应的文件描述符,成功返回文件描述符失败返回-1
FILE *fdopen(int fd,const char *mode)//该函数功能是根据文件描述符返回文件流,成功返回文件指针,失败返回NULL,mode可以为r,w,a等
就I/O模式相内核提出建议
#include<fcntl.h>
int posix_fadvise(int fd,off_t offset,off_t len,int advice)
fd文件描述符,offset起始位置,len长度
成功返回0,失败返回一个负数
其中advice参数可以是:
POSIX_FADV_NORMA 无特别建议,文件预读窗口大小为默认值128kb
POSIX_FADV_SEQUENTIAL 进程估计会从低偏移量到高偏移量顺序读取数据,文件预读窗口大大小为默认值两倍
POSIX_FADV_RANDOM 随机顺序访问数据,在linux中该选项会禁用文件预读
POSIX_FADV_WILLNEED 预计不久就会用到,将数据填充到缓冲区高速缓存中,后续对该文件的读取就会直接从高速缓存中读取数据即可
POSIX_FADV_DONTNEED 在不久的将来不会访问指定的文件区域,释放相关的高速缓存页面(如果存在的话)
POSIX_FADV_NOREUSE 一次性访问指定文件区域,不再复用,访问一次后即可释放页面