Linux文件描述符
![](https://img2023.cnblogs.com/blog/2956304/202301/2956304-20230131160417018-1677560196.png)
如上图所示,应用程序要想获取磁盘中的数据,首先需要查询其PCB中的文件描述符表,利用文件描述符表中的指针找到文件表的表项,然后再通过文件表中的指针找到inode表的表项,inode表中存放着数据块在内存或磁盘中的位置。
需要注意的一点是,应用程序只有权限访问其PCB,而无权限去访问“文件表”和“inode”表,这两张表是由操作系统维护的,所以应用程序要想获取内存或磁盘中的数据,只能交出自己的“需求清单”,然后由操作系统按照“清单”去查询数据并返回给应用程序,而这一“清单”就是“文件描述符表”。
文件描述符表记录着进程已经打开文件的文件描述符。
Linux内核代码中:
struct file * fd_array[NR_OPEN_DEFAULT];
文件描述符就是这个数组fd_array的下标,而数组里面存储着指向“文件表”的指针。
文件描述符0是标准输入,1是标准输出,2是标准错误,大于等于3的文件描述符才可以被分给其它文件。并且系统分配文件描述符时,是按照“空闲、最小”的规则分配的。
假设3,4,5,6已经被分配给了文件A,B,C,D,然后文件B被删除,文件描述符4被回收。如果又来了个文件E,此时3,5,6已经被分配,4是空闲且最小的文件描述符,所以将4分配给文件E。
参考链接:
- https://blog.csdn.net/wwwlyj123321/article/details/100298377
- https://zhuanlan.zhihu.com/p/134036259