APUE,TLPI读书笔记——linux IO相关

文件描述符:一个非负整数,是内核打开文件表的索引。

APUE,TLPI读书笔记——linux IO相关_第1张图片

每一个进程有自己的文件描述符表,内核会维护一个打开文件表,不同的描述符指向内核的文件打开表,并指向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 */);//控制一个流设备


flags=fcntl(fd,cmd,...);//文件控制操作
newfd=dup(oldfd)//在进程文件描述符表中创建文件描述符的副本
newfd=dup2(oldfd,newfd)//能够对已经存在fd进行操作。如果之前打开,会关闭
newfd=dup3(oldfd,newfd,flags);
pread,pwrite函数在offset参数处读写,不会改变文件偏移,适用于多线程读写
readv,writev(分散输入,集中输出)输入/输出到iovec指针数组指向的缓冲区中
truncate(pathname,length),ftruncate(fd,length)截断文件,设置文件大小为length,多丢少补(会造成空洞)
open或fcntl中设置O_NONBLOCK标志,可为非阻塞IO
大文件IO,open64,fopen64,lseek64等等
/dev/fd查看文件描述符(linux所有都会以文件形式反应)
mkstemp(template),FILE* tmpfile(void)创建临时文件。后者会创建一个名字唯一临时文件,文件流关闭后自动删除

C标准库:
对底层系统读写的包装
具体介绍可以参考: C标准IO


文件IO缓冲

read,write操作磁盘不会直接磁盘访问,而是在用户空间缓冲区与内核缓冲区之间复制数据。

APUE,TLPI读书笔记——linux IO相关_第2张图片

根据读写数据的大小选择合适的缓冲区大小,优化读写效率

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则是更新所有包含文件信息的内核缓冲区都刷新到磁盘

APUE,TLPI读书笔记——linux IO相关_第3张图片

posix_advise提供对内核的IO模式建议,详情man

文件的O_DIRECT标志绕过缓冲区直接IO



你可能感兴趣的:(linux)