文件描述符、文件表、FILE 结构体笔记

文件描述符、文件表、FILE 结构体笔记 一、文件描述符与文件描述符表文件描述符进程的“文件描述符表”的索引。文件描述符表每个进程在内核中维护一个struct files_struct结构其中包含一个指针数组通常叫fd_array或动态分配的fd数组每个元素是一个struct file *类型的指针它指向内核中对应的struct file对象数组的下标就是文件描述符的值。二、内核层与用户层的两个概念“文件表” 与FILE结构体1. 内核层文件表项struct file位于内核空间属于内核对象。每个打开的文件对应一个struct file对象。包含文件偏移、打开模式、指向 inode 的指针、引用计数等。是内核管理打开文件的内部数据结构。内核全局的打开文件表—open file table简称“文件表”属于内核中的一种表。所有struct file对象的集合。Linux 内核通过全局链表如file_list或哈希表将所有打开的文件对象串联起来并维护统计信息如nr_files。2. 用户层FILE结构体位于用户空间C 标准库。封装了文件描述符指向内核文件表的索引。提供用户态缓冲区、错误/EOF 标志、缓冲模式等。用于实现带缓冲的 I/O 操作。每个FILE*指向一个FILE对象。三.文件描述符表内核全局文件表——两种不同的“集合”集合名称管理对象组织形式作用文件描述符表每个进程指向struct file的指针数组fd_array[]按文件描述符整数索引让进程通过整数快速找到对应的内核文件对象文件表系统唯一但内核还有很多其他表所有的struct file对象本身链表file_list或哈希表遍历所有打开的文件、统计、资源回收、fget等