我有一些关于 UNIX 的问题。
- UNIX 在哪里存储与每个打开文件关联的偏移量?在 i 节点中?在数据块中?别的地方?
- UNIX 在哪里存储打开每个文件的权限(只读等)?
- UNIX 在哪里存储与 i 节点关联的名称/链接列表?
我有一些关于 UNIX 的问题。
您似乎缺少一个重要的区别,更具体地说是磁盘数据和内存数据之间的区别:
目录和文件内容、访问权限、扩展属性和任何其他预期在系统重启后持续存在的内容都存储在永久存储的文件系统中,通常存储在 i 节点中。例如,文件的所有者、组和权限通常存储在 i 节点中。
与文件系统当前操作相关的任何内容,例如打开文件描述符、文件偏移量和缓存数据,都保存在计算机内存中的内核空间数据结构中。
就存储与 i-node 关联的名称而言,大多数 Unix 风格的文件系统没有特定的数据结构,允许在恒定时间内将 i-node 映射到名称。考虑到通常我们对有意义的反向映射(即名称到 i 节点)感兴趣。相反,每个目录的数据块包含每个文件和子目录的名称和关联的 i 节点标识符。如果想要一个特定i 节点的名称列表,他们通常必须遍历文件系统的整个目录树以寻找匹配项......
应该指出的是,现代文件系统倾向于模糊数据和元数据之间的界限。例如,扩展属性可以存储在数据块中,或者非常小的文件可以完全打包在它们自己的 i 节点中。一些文件系统甚至没有专用的数据块或 i 节点。
文件偏移存储在文件描述中,并且有一个全局(系统范围)文件描述表。每个进程中的文件描述符用于访问文件描述。不存储权限:仅在打开文件时检查权限。与 inode 关联的链接列表存储在文件系统的目录中。实际上,目录的合理定义是“指向 inode 的链接列表”。