我有《Unix 编程环境》一书的第一版。在第 2 章中,作者指出目录可以作为文件读取,并提到了有关这些文件格式的一些事实。他们给出了一些用法示例,例如cat .
(练习 2-2 中)。
至少在达尔文,目录不再像文件一样可读。至少,它们在读取时看起来是零长度文件。
这个变化是什么时候发生的?有相关的官方文档吗?
答案1
最新 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;
}
虽然具体的文件系统实现可以覆盖它(就像 Ceph 所做的那样:http://lxr.free-electrons.com/source/fs/ceph/dir.c#L1142),默认行为是每当有人尝试 read() 目录时返回 EISDIR,即使该目录是只读打开的。
我已经将这一变化追溯到 2.0.x,至少对于 ext2 文件系统来说,情况仍然如此。
所以,是的,在兼容 POSIX 的操作系统上,您应该能够读取目录,但某些内核(例如 Linux 以及显然其他内核)只是忽略此条件并违反标准。