Когда каталоги перестали быть читаемыми как файлы?

29

У меня есть 1-е издание книги «Среда программирования Unix». В главе 2 авторы утверждают, что каталоги доступны для чтения в виде файлов, и упоминают некоторые факты о формате этих файлов. Они дают некоторые примеры использования, такие как cat .(в упражнении 2-2).

По крайней мере, в Дарвине каталоги больше не читаются как файлы. По крайней мере, они кажутся файлами нулевой длины при чтении.

Когда произошло это изменение, и есть ли официальные документы об этом?

Тайлер
источник
1
Я помню, как он работал в период с 1991 по сентябрь 1995 года на солнечной солнечной батарее. Я думаю, что это перестало работать для меня где-то в тот период времени, а также. Когда мы перешли на sparc машины с системой V. (не помню, чтобы хорошо). Это, вероятно, зависит от файловой системы. Если файловая система не хранит данные точно так, как описано, то они сломаются, если не будет добавлен слой совместимости. Также не работает сегодня с использованием Debian Gnu + Linux.
Ctrl-Alt-Delor
1
Я знаю, что чтение каталога как файла работало под Unix System V в конце 80-х - начале 90-х годов. Работало под SunOS. Это работало под некоторыми версиями Irix. Я думаю, что переход на виртуальную файловую систему и использование многих базовых дисковых организаций означает, что вы не сможете эффективно поддерживать это.
Брюс Эдигер
8
Дополнительная (неавторизованная) информация может быть найдена здесь: utcc.utoronto.ca/~cks/space/blog/unix/ReaddirHistory
camh
Я проверил AIX и Solaris - действительно, в AIX вы все еще можете, cat .а в Solaris 11 (как в Linux) - нет. Круто.
gena2x

Ответы:

13

Ссылка на номер ошибки из последней спецификации POSIX (POSIX.1-2008) гласит:

[EISDIR]

Это каталог. Предпринята попытка открыть каталог с указанным режимом записи.

Это означает, что в POSIX-совместимой ОС вы должны иметь возможность читать () каталог, если вы открыли его только для чтения (O_RDONLY).

Я только что попробовал это на коробке NetBSD (которая действительно заботится о POSIX), и работает как ожидалось, в то время как это терпит неудачу на GNU / Linux с EISDIR (что не должно происходить).

Беглый взгляд на 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 всякий раз, когда кто-то пытается read () каталог, даже если он открыт только для чтения.

Я проследил это изменение до версии 2.0.x, и, по крайней мере, для файловой системы ext2 это все еще имело место.

Итак, да, в POSIX-совместимой ОС вы должны иметь возможность читать каталог, но некоторые ядра (например, Linux и, очевидно, другие) просто игнорируют это условие и нарушают стандарт.

Серхио Л. Паскуаль
источник
6
Согласно Open Group, поведение Linux здесь является законным в соответствии с расширением стандарта XSI . readdir(2)более портативный. Это наводит на мысль, что правильный ответ на вопрос OP: «Когда XSI стал популярным».
Кевин