Коли каталоги перестали читатись як файли?


29

У мене вийшло 1-е видання книги «Програми навколишнього середовища Unix». У главі 2 автори заявляють, що каталоги читаються як файли, і згадують деякі факти про формат цих файлів. Вони наводять кілька прикладів використання, таких як cat .(у вправі 2-2).

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

Коли відбулася ця зміна і чи є офіційна документація щодо неї?


1
Я пам'ятаю, як він працював деякий час 1991sep-1995jun на сонці сонця. Я думаю, що це перестало працювати і для мене десь у той період часу. Коли ми модернізували до 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 кожного разу, коли хтось намагається прочитати () каталог, навіть якщо він відкритий лише для читання.

Я простежив цю зміну ще до 2.0.x, і принаймні для файлової системи ext2 це все одно було.

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


6
За даними Open Group, поведінка Linux тут є законною згідно з розширенням XSI до стандарту . readdir(2)є більш портативним. Це підказує мені правильну відповідь на питання ОП: "Коли XSI став популярним".
Кевін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.