Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
UNIX在哪里存储每个文件的打开文件偏移量、权限和名称/链接列表?_Unix - Fatal编程技术网

UNIX在哪里存储每个文件的打开文件偏移量、权限和名称/链接列表?

UNIX在哪里存储每个文件的打开文件偏移量、权限和名称/链接列表?,unix,Unix,我有一些关于UNIX的问题 UNIX在哪里存储与每个打开的文件关联的偏移量?在i节点中?在数据块中?其他地方 UNIX在哪里存储打开每个文件的权限(只读等) UNIX在哪里存储与i节点关联的名称/链接列表 文件偏移量存储在文件描述中,并且有一个全局(系统范围)文件描述表。每个进程中的文件描述符用于访问文件描述。不存储权限:仅在打开文件时检查权限。与inode关联的链接列表存储在文件系统的目录中。实际上,目录的合理定义是“指向inode的链接列表”。有一个重要的区别,您似乎忽略了,更具体地说,就是

我有一些关于UNIX的问题

  • UNIX在哪里存储与每个打开的文件关联的偏移量?在i节点中?在数据块中?其他地方
  • UNIX在哪里存储打开每个文件的权限(只读等)
  • UNIX在哪里存储与i节点关联的名称/链接列表

  • 文件偏移量存储在文件描述中,并且有一个全局(系统范围)文件描述表。每个进程中的文件描述符用于访问文件描述。不存储权限:仅在打开文件时检查权限。与inode关联的链接列表存储在文件系统的目录中。实际上,目录的合理定义是“指向inode的链接列表”。

    有一个重要的区别,您似乎忽略了,更具体地说,就是磁盘数据和内存数据之间的区别:

    • 目录和文件内容、访问权限、扩展属性以及在系统重新启动后预期会持续存在的任何其他内容(例如,系统重新启动)存储在永久存储的文件系统中,通常存储在i节点中。例如,文件的所有者、组和权限通常存储在i节点中

    • 与文件系统当前操作相关的任何内容,如打开的文件描述符、文件偏移量和缓存数据,都保存在计算机内存中的内核空间数据结构中

    就存储与i节点关联的名称而言,大多数Unix风格的文件系统都没有特定的数据结构,允许在固定时间内将i节点映射到名称。考虑到一般情况下,我们对有意义的反向映射(即到i节点的名称)感兴趣。相反,每个目录的数据块包含每个文件和子目录的名称和关联的i节点标识符。如果想要一个特定i节点的单一名称列表,他们通常必须遍历文件系统的整个目录树以查找匹配项


    应该指出的是,现代文件系统往往会模糊数据和元数据之间的界限。例如,扩展属性可以存储在数据块中,或者非常小的文件可以完全打包在它们自己的i节点中。有些文件系统甚至没有专用的数据块或i节点。

    对于您所谓的“权限”来说,可能更好的术语是“访问模式”(因为您说的是“打开每个文件时使用的权限”)。打开文件时使用的访问模式位于打开文件描述表中(可从文件描述符轻松访问),但访问模式未通过
    fcntl()
    更改。或者:目录是“索引节点的(简单)名称列表”。Simple表示目录中的名称不包含斜杠
    '/'
    (或ASCII NUL
    '\0'
    )。