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

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

我有《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 以及显然其他内核)只是忽略此条件并违反标准。

相关内容