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 和其他内核)只是忽略了这种情况并违反了标准。
归档时间: |
|
查看次数: |
1839 次 |
最近记录: |