文件描述符¶
Linux 系统中,把一切都看做是文件(硬件设备,socket,磁盘,进程,线程等)。
当进程打开现有文件或创建新文件时,内核向进程返回一个文件描述符,文件描述符就是内核为了高效管理已被打开的文件所创建的索引,用来指向被打开的文件,所有执行I/O操作的系统调用都会通过文件描述符。
- 每个文件描述符会与一个打开的文件相对应
- 不同的文件描述符也可能指向同一个文件
- 相同的文件可以被不同的进程打开,也可以在同一个进程被多次打开
三个被维护的结构¶
- 进程级文件描述符表(file descriptor table)
- 系统级打开文件表(open file table)
- 文件系统i-node表(i-node table)
文件描述符表¶
内核为每个进程维护一个文件描述符表,该表每一条目都记录了单个文件描述符的相关信息,包括:
- 控制标志(flags),目前内核仅定义了一个,即
close-on-exec - 打开文件描述体指针
打开文件表¶
内核对所有打开的文件维护一个系统级别的打开文件描述表(open file description table),简称打开文件表。表中条目称为打开文件描述体(open file description),存储了与一个打开文件相关的全部信息,包括:
- 文件偏移量(file offset),调用
read()和write()更新,调用lseek()直接修改 - 访问模式,由
open()调用设置,例如:只读、只写或读写等 i-node对象指针
i-node表¶
每个文件系统会为存储于其上的所有文件(包括目录)维护一个i-node表,单个i-node包含以下信息:
- 文件类型(file type),可以是常规文件、目录、套接字或
FIFO - 访问权限
- 文件锁列表(file locks)
- 文件大小
Linux查询文件位置:
- 读出这个文件的inode编号
- 根据inode编号找到inode信息
- 根据信息,读取文件数据所在的block
