1.1.1 文件、文件描述符和文件表
Linux内核将一切视为文件,那么Linux的文件是什么呢?
其既可以是事实上的真正的物理文件,也可以是设备、管道,甚至还可以是一块内存。
狭义的文件是指文件系统中的物理文件,而广义的文件则可以是Linux管理的所有对象。
这些广义的文件利用VFS机制,以文件系统的形式挂载在Linux内中,对外提供一致的文件操作接口。
从数值上看,文件描述符是一个非负整数,其本质就是一个句柄,所以也可以认为文件描述符就是一个文件句柄。
那么何为句柄呢?
一切对于用户透明的返回值,即可视为句柄。
重点:用户空间利用文件描述符与内核进行交互;而内核拿到文件描述符后,可以通过它得到用于管理文件的真正的数据结构。
使用文件描述符即句柄,有两个好处:
一是增加了安全性,句柄类型对用户完全透明,用户无法通过任何hacking的方式,更改句柄对应的内部结果,比如Linux内核的文件描述符,只有内核才能通过该值得到对应的文件结构;
二是增加了可扩展性,用户的代码只依赖于句柄的值,这样实际结构的类型就可以随时发生变化,与句柄的映射关系也可以随时改变,这些变化都不会影响任何现有的用户代码
Linux的每个进程都会维护一个文件表,以便维护该进程打开文件的信息,包括打开的文件个数、每个打开文件的偏移量等信息。
1.1.2 内核文件表的实现
内核中进程对应的结构是ta

本文详细介绍了Linux中文件的概念,包括狭义的物理文件和广义的管理对象。文件描述符作为句柄用于用户空间与内核交互,提供了安全性和可扩展性。每个进程维护一个文件表,存储打开文件的信息。内核通过优化策略,如默认大小的fdtable和fd_array,减少内存频繁申请。在进程fork时,新进程的文件表通过dup_fd初始化,保持与父进程的文件描述符关联。
最低0.47元/天 解锁文章
1223

被折叠的 条评论
为什么被折叠?



