1. 文件描述符(重点)
在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。如果此时去打开一个新的文件,它的文件描述符会是3。
1.1概念介绍
文件描述符的操作(如: open(),creat(),close(),read()))返回的是一个文件描述符,它是int类型的整数,即fd,其本质是文件描述符表中的下标,它起到一个索引的作用,进程通过PCB中的文件描述符表找到该fd所指向的文件指针filp。每个进程在PCB(Process Control Block)即进程控制块中都保存着一份文件描述符表,文件描述符就是这个表的索引,文件描述表中每个表项都有一个指向已打开文件的指针; 已打开的文件在内核中用file
结构体表示,文件描述符表中的指针指向file
结构体。每打开一个文件,fd默认从最小的未被使用的下标开始分配。文件描述符的缺点:不能移植到UNIX以外的系统上去,也不直观。
下面画张图来表示它们之间的关系:
而每个文件中又主要包含以下这些信息:
1.2图表解释
在file
结构体中维护File Status Flag(file
结构体的成员f_flags
)和当前读写位置(file
结构体的成员f_pos
)。在上图中,进程1和进程2都打开同一文件,但是对应不同的file
结构体,因此可以有不同的File Status Flag和读写位置。file
结构体中比较重要的成员还有f_count
,表示引用计数(Reference Count),后面我们会讲到,dup
、fork
等系统调用会导致多个文件描述符指向同一个file
结构体,例如有fd1
和fd2
都引用同一个file
结构体,那么它的引用计数就是2,当close(fd1)
时并不会释放file
结构体,而只是把引用计数减到1,如果再
延伸阅读
学习是年轻人改变自己的最好方式