读取目录以查看文件到 inode 的映射

The*_*eer 6 filesystems directory

我只是在学习文件系统,据说目录只是一个普通文件,它保留了文件-inode 对的列表。

如果我尝试Downloads使用以下任何一项打开目录cat less tail,它只会输出它的目录并且无法打开。

思路怎么读呢?

Cel*_*ada 9

更正:目录是文件名-inode 对的列表。它不是一个“普通”文件。与符号链接、套接字和设备节点一样,其行为与普通文件不同。

从 shell 中,您可以看到带有ls -i.

从C中,返回的结构体readdir()包含ad_name和ad_ino元素,从中也可以看到这个映射。

从用户空间来看,目录将文件名映射到 inode 的事实通常并不那么重要,因为内核无论如何都要求您按文件名指定文件。它不允许您通过 inode 编号请求文件。

符号链接是另一种文件类型的示例,其中包含无法读取的信息,就好像它是带有系统调用的字节流,如read(). 像普通文件一样,它包含数据。在这种情况下,数据具有特殊含义:它是一个路径名(它是一个字符串),用于命名符号链接的目标。与普通文件不同的是,内容不是用write()而是用写入symlink(),内容不是用read()而是用读取readlink()

  • 所有用于读取常规文件的工具,如 `cat` 都使用 `read()` 和类似的系统调用,假设文件是​​字节流。但是目录不是(至少在概念上)作为字节流,它是一个映射。内核提供专门用于读取此映射的系统调用。`ls` 之类的工具使用这些系统调用。所以简短的回答,是的:要读取目录的内容,您需要一个旨在读取目录的工具。 (2认同)