如何一图解析Unix文件句柄与文件共享机制?
摘要:与文件相关的一些概念 在开始上图之前,先说明几个和 unix 文件密切相关的术语,方便后续讨论使用 文件句柄文件描述符 (file descriptor 或 FD):描述一个打开文件相关属性的类型; 文件描述符表 (file desc
与文件相关的一些概念
在开始上图之前,先说明几个和 unix 文件密切相关的术语,方便后续讨论使用
文件句柄 / 文件描述符 (file descriptor 或 FD):描述一个打开文件相关属性的类型;
文件描述符表 (file descriptor table 或 FDT):每个进程拥有一个 FDT,其中每个表项是一个 FD,使用 FDT 的下标表示各个 FD(从 0 开始的整数);
全局打开文件表 (open file table 或 OFT):系统只有一个 OFT,其中每个表项被 FD 所引用;
i 节点 (inode):描述文件系统上的一个文件,例如 所有者/大小/设备/起始位置 等,它只包含和文件系统相关的属性;
v 节点 (vnode):描述文件相关的操作,例如 读 / 写 / 移动相对偏移量 等,它只包含和文件系统无关的属性,用于统合各种不同类型的文件系统;
其中前三项只有文件被打开后才有相应的结构,而后两项只要文件存在就存在了,与文件是否打开没有关系。
文件相关概念之间的关系
它们之间的关系是怎样的呢,现在上图
图中左侧展示了两个进程,蓝色的为 ProcessA (PA),红色的为 ProcessB (PB),每个进程都有一个 FDT,其中包含若干个 FD,可以看到每个 FD 由两部分组成:
pflag :在进程中的标志位,目前只有一个标志位 O_CLOEXEC,置位的话表示在进程执行 exec 函数族后自动关闭此文件句柄,默认是不关闭的;
fileptr :指向 OFT 中相应的表项,来描述文件剩余的属性。
再观察 OFT 中表项的内容,可以看到它是由以下几部分组成:
oflag :文件打开标志位,除 O_CLOEXEC 之外的标志位,如权限位 O_RDONLY / O_WRONLY / O_RDWR,创建位 O_CREAT / O_EXCL,追加位 O_APPEND,截断位 O_TRUNC,异步位 O_NONBLOCK 等均由这个字段指定。
offset :当前文件偏移;
vnode :指向该文件的 v 节点。
再观察文件属性相关的节点,它一般由下面两部分组成:
vnode :文件的 v 节点信息,通常是一些操作的抽象,用于构建文件系统无关的 VFS;
inode :文件的 i 节点信息。
