目录何时停止作为文件可读?

Tyl*_*ler 31 filesystems directory files

我有 Unix 编程环境书的第一版。在第 2 章中,作者声明目录作为文件是可读的,并提到了有关这些文件格式的一些事实。他们给出了一些使用示例,例如cat .(在练习 2-2 中)。

至少在 Darwin 中,目录不再作为文件可读。至少,它们在读取时看起来是零长度文件。

这个变化是什么时候发生的,有没有关于它的官方文档?

小智 15

来自最新 POSIX 规范 (POSIX.1-2008) 的错误编号参考指出:

[EISDIR]

是一个目录。试图以指定的写入模式打开目录。

这意味着,在兼容 POSIX 的操作系统上,如果您以只读方式打开目录(O_RDONLY),您应该能够 read() 目录。

我刚刚在 NetBSD(它真正关心 POSIX)机器上尝试了这个,并且按预期工作,而它在带有 EISDIR 的 GNU/Linux 上失败(这不应该发生)。

快速浏览 Linux 表明这是有意的(http://lxr.free-electrons.com/source/fs/libfs.c#L189):

ssize_t generic_read_dir(struct file *filp, char __user *buf, size_t siz, loff_t *ppos)
{
        return -EISDIR;
}
Run Code Online (Sandbox Code Playgroud)

虽然具体的文件系统实现可以覆盖它(就像 CEPH 那样:http : //lxr.free-electrons.com/source/fs/ceph/dir.c#L1142),但默认行为是每当有人试图read() 一个目录,即使它是只读的。

我已经将此更改追溯到 2.0.x,至少对于 ext2 文件系统,情况仍然如此。

所以,是的,在符合 POSIX 的操作系统上,您应该能够读取目录,但是某些内核(例如 Linux 和其他内核)只是忽略了这种情况并违反了标准。

  • 根据 Open Group 的说法,Linux 在此处的行为是 [在标准的 XSI 扩展下是合法的](http://pubs.opengroup.org/onlinepubs/9699919799/functions/read.html)。`readdir(2)` 更便携。这向我表明 OP 问题的正确答案是“当 XSI 流行时”。 (9认同)