文件描述符:一个非负整数,是内核打开文件表的索引。
每一个进程有自己的文件描述符表,内核会维护一个打开文件表,不同的描述符指向内核的文件打开表,并指向I-node表上的文件实际位置。
linux系统的文件IO函数(具体使用详情可以在linux shell中 man -a + 函数名查询或者在man-online上查询):
fd=open(pathname,flags,mode);
numread=read(fd,buffer,count);//读取至多count字节,返回读到字节数
numwritten=write(fd,buffer,count);
status=close(fd);
currpos=lseek(fd,offset,whence);//返回文件新文件偏移量
int ioctl(int fildes, int request, .../*arg */);//控制一个流设备
文件IO缓冲
read,write操作磁盘不会直接磁盘访问,而是在用户空间缓冲区与内核缓冲区之间复制数据。
根据读写数据的大小选择合适的缓冲区大小,优化读写效率
C标准库的缓冲:setvbuf设置缓冲区1.不缓冲;2.行缓冲;3.全缓冲;fflush刷新缓冲区。
fsync()调用缓冲数据与fd相关的刷新到磁盘
fdatasync()与fsync()类似,只是强制文件处于synchronized IO data integrity completion状态
网上查到的:
synchronized IO data integrity completion:确保针对文件的一次更新传递了足够的信息(部分文件元数据)到磁盘,以便于之后对数据的获取。
synchronized IO file integrity completion:确保针对文件的一次更新传递了所有的信息(所有文件元数据)到磁盘,即使有些在后续对文件数据的操作并不需要。
sync则是更新所有包含文件信息的内核缓冲区都刷新到磁盘
posix_advise提供对内核的IO模式建议,详情man
文件的O_DIRECT标志绕过缓冲区直接IO