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


29

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

至少在达尔文市,目录不再作为文件可读。至少,它们在读取时似乎是零长度文件。

何时发生此更改,是否有任何官方文档?


1
我记得它在1991年9月至1995年6月的某个时间对太阳日晒工作。我认为在那段时间里,它也停止为我服务。当我们使用系统V升级到sparc机器时(记不清了)。它可能取决于文件系统。如果文件系统未完全按照描述存储数据,则除非添加了兼容层,否则文件系统将损坏。使用Debian Gnu + Linux今天也无法使用。
ctrl-alt-delor 2014年

1
我知道在80年代后期-90年代初,将目录读取为文件可以在Unix System V下工作。它在SunOS下工作。它在Irix的某些版本下工作。我认为进入虚拟文件系统并允许许多底层磁盘组织意味着您不能真正有效地支持此功能。
Bruce Ediger 2014年

8
更多(非权威)信息可​​以在这里找到:utcc.utoronto.ca/~cks/space/blog/unix/ReaddirHistory
camh 2014年

我在AIX和Solaris上进行了检查-实际上,在AIX上您仍然可以,cat .而在Solaris 11上(如在Linux中)则不能。凉。
gena2x 2014年

Answers:


13

最新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),但是默认行为是只要有人尝试执行EISDIR,它就会返回EISDIR read()目录,即使它是只读的也是如此。

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

因此,是的,在兼容POSIX的OS上,您应该能够读取目录,但是某些内核(例如Linux,显然还有其他内核)只是忽略了这种情况并违反了标准。


6
根据Open Group的说法,在XSI对标准的扩展中,Linux的行为是合法的readdir(2)更便携。这对我来说,对OP问题的正确答案是“ XSI何时流行”。
凯文(Kevin)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.