我开始阅读《Linux 系统编程》第二版,我对文件表(即“每个进程的打开文件列表”)感到好奇。文件表是否像 SQL db 中的表一样,使用 fds 作为主键?如果是这样,这是否意味着条目重复,还是将其拆分为单独的表并进行规范化?
或者因为我们正在处理直接的 C/汇编,所以它的工作方式是否完全不同?如果是的话,使用什么数据结构?
该子系统在源代码中的何处定义?我这样做的大部分原因是为了更好地理解 C 和 Linux。如果我知道在哪里可以找到它,那会给我一个更好的主意。
答案1
由于这是 C,“表”可能是“结构数组”的缩写。
您可能想阅读《理解Linux内核》或者《Linux内核开发》。
或者采取困难的方式并阅读源代码;好的起点可能是:
include/linux/fdtable.h
和
include/linux/fs.h
。
答案2
每个进程打开文件的列表 表示每个进程表示为task_struct
对象有一个成员指向files_struct
打开文件信息的对象,以及files_struct
保留fdtable
其中有 :
- 打开文件描述符的数组(在
open_fds
成员中) - 内部数组
struct file
对象(在fds
成员中)保存有关低级块的有用信息,例如struct inode
为了更好地理解fdtable
,您可以阅读fdget()
或同一 C 文件中的其他类似函数,在给定的文件描述符(用户应用程序中的整数)struct file
中查找正确的对象,许多文件 I/O 系统调用调用(例如、、 或 )fdtable
fdget()
fchown()
preadv()
ftruncate()
所有链接都是6.0版本的内核代码