您可以将 macOS 目录作为文件读取吗?
Can you read macOS directories as files?
我正在阅读 Unix 编程环境,根据这本书,UNIX 目录是包含文件名列表及其 inode 编号的文件。根据书中的例子,可以运行 od -c .
像获取一个简单的文件一样获取当前工作目录的内容。
但是,自从这本书于 1984 年出版并且 运行 上面的命令输出 od: .: Is a directory
以来,情况似乎发生了变化。这是 运行 在机器 运行ning macOS 12.0.1 上,但是我猜这种行为在其他现代 UNIX 派生操作系统中是相同的。
我的问题是,到底发生了什么?目录不再是文件了吗?如果是,一切皆文件原则发生了什么?如果不是,为什么不能像读取文件一样读取目录的内容?
现代 Unix 系统仍然允许进程像打开任何其他文件一样打开目录。它们只是无法读取或写入。目录并不是唯一一种既不允许读取也不允许写入的文件:许多操作系统都有支持某些 ioctl
的设备文件,但既不支持 read
也不支持 write
.
错误“是一个目录”来自 read
系统调用,而不是来自 open
。
$ perl -e 'sysopen D, ".", 0 or die "open: $!"; sysread D, $a, 42 or die "read: $!"'
read: Is a directory at -e line 1.
最早的 Unix 系统在内部将目录视为常规文件。要列出目录的内容,进程可以读取文件,标准库中的代码知道如何解码文件系统格式并将一堆字节转换为文件名和属性列表。
当 Unix 系统开始支持多个文件系统时,它不再具有扩展性。不同的文件系统类型以不同的方式编码目录内容。使用网络文件系统,目录的内容可以在不同的机器上进行不同的编码,因此应用程序不能期望所有目录都采用本地标准格式,除非内核为它们翻译。
一些 Unix 系统仍然允许进程读取目录,但内容只是字节流,没有明确的意义,或者这种能力仅限于其本机文件系统上的目录。许多现代系统(至少 Linux、FreeBSD 和 macOS)完全禁止从目录中读取。
现代文件系统变得越来越复杂,不一定将目录表示为字节序列。一些文件系统允许小文件的内容直接存储在目录数据结构中,在这种情况下,内核必须不允许读取目录,因为具有读取目录权限的 reader 不一定具有读取其中文件的权限。
写入目录文件在非特权进程的概念一出现就被禁止非特权进程,因为这很容易使文件系统不一致,然后甚至被禁止特权进程,因为同时编辑目录的两个进程可能会做出冲突的更改,从而导致文件系统不一致。
我正在阅读 Unix 编程环境,根据这本书,UNIX 目录是包含文件名列表及其 inode 编号的文件。根据书中的例子,可以运行 od -c .
像获取一个简单的文件一样获取当前工作目录的内容。
但是,自从这本书于 1984 年出版并且 运行 上面的命令输出 od: .: Is a directory
以来,情况似乎发生了变化。这是 运行 在机器 运行ning macOS 12.0.1 上,但是我猜这种行为在其他现代 UNIX 派生操作系统中是相同的。
我的问题是,到底发生了什么?目录不再是文件了吗?如果是,一切皆文件原则发生了什么?如果不是,为什么不能像读取文件一样读取目录的内容?
现代 Unix 系统仍然允许进程像打开任何其他文件一样打开目录。它们只是无法读取或写入。目录并不是唯一一种既不允许读取也不允许写入的文件:许多操作系统都有支持某些 ioctl
的设备文件,但既不支持 read
也不支持 write
.
错误“是一个目录”来自 read
系统调用,而不是来自 open
。
$ perl -e 'sysopen D, ".", 0 or die "open: $!"; sysread D, $a, 42 or die "read: $!"'
read: Is a directory at -e line 1.
最早的 Unix 系统在内部将目录视为常规文件。要列出目录的内容,进程可以读取文件,标准库中的代码知道如何解码文件系统格式并将一堆字节转换为文件名和属性列表。
当 Unix 系统开始支持多个文件系统时,它不再具有扩展性。不同的文件系统类型以不同的方式编码目录内容。使用网络文件系统,目录的内容可以在不同的机器上进行不同的编码,因此应用程序不能期望所有目录都采用本地标准格式,除非内核为它们翻译。
一些 Unix 系统仍然允许进程读取目录,但内容只是字节流,没有明确的意义,或者这种能力仅限于其本机文件系统上的目录。许多现代系统(至少 Linux、FreeBSD 和 macOS)完全禁止从目录中读取。
现代文件系统变得越来越复杂,不一定将目录表示为字节序列。一些文件系统允许小文件的内容直接存储在目录数据结构中,在这种情况下,内核必须不允许读取目录,因为具有读取目录权限的 reader 不一定具有读取其中文件的权限。
写入目录文件在非特权进程的概念一出现就被禁止非特权进程,因为这很容易使文件系统不一致,然后甚至被禁止特权进程,因为同时编辑目录的两个进程可能会做出冲突的更改,从而导致文件系统不一致。