目录的八进制转储

bir*_*day 8 linux filesystems directory

我从车库拍卖中得到了 Kernighan 和 Pike 所著的 The Unix Programming Environment。我对有关 UNIX 文件系统的章节很感兴趣。自然,我也觉得这段话很有意思:

是时候查看目录中的字节了:

$ od -cb .
0000000    4    ;    .   \0   \0   \0   \0   \0   \0   \0   \0   \0   \0   \0   \0   \0
          064  073  056  000  000  000  000  000  000  000  000  000  000  000  000  000
....
Run Code Online (Sandbox Code Playgroud)

它真的很长,所以我不会把整个内容都打出来。它的要点是它以存储在系统上的方式显示目录。我迅速冲到我的笔记本电脑 (Debian) 上尝试一下。我输入了书中的命令。

$ od -cb .
od: .: read error: Is a directory
0000000
Run Code Online (Sandbox Code Playgroud)

显然它不会让我查看目录的原始内容。所以这是我的问题。

Linux 内核是否以与原始 UNIX 内核不同的方式存储目录?如果没有,为什么需要向用户隐藏目录的实际字节?

Gil*_*il' 7

每种文件系统类型以不同的方式存储目录。有许多不同的文件系统类型具有不同的特性——有利于高吞吐量、有利于高并发、有利于有限内存环境、读写性能之间、复杂性和稳定性之间的不同折衷等等。你的书描述了早期使用的文件系统Unix系统。现代系统支持许多不同的文件系统。

Unix 的早期版本在内核之外有很多文件系统操作。例如,mkdir并且rmdir通过直接编辑文件系统的一些数据结构的工作。这很快就被一个统一的目录访问界面更换,opendir/ readdir/closedir家庭,这使得应用程序可以轻松目录,而不必知道他们是如何引擎盖下实现的。

Linux 下无法读取目录内容的原因不是因为它们必须被隐藏,而是因为只有实现了特性才存在,而这个特性是没有意义的,并且是有成本的。鉴于格式取决于文件系统,这是一个相当无意义的功能:程序无法知道它正在读取的内容的格式。支持两者都不是一个完全微不足道的功能:一些文件系统以不仅仅是字节流的方式组织目录,例如它可能被组织为B-tree。为了向后兼容,一些 Unix 变体仍然允许应用程序直接读取目录内容,但 Linux 没有这个功能(据我所知从来没有——它在 1990 年代初期已经过时了)。