Mám 1. vydání knihy The Unix Programming Environment. V kapitole 2 autoři uvádějí, že adresáře jsou čitelné jako soubory, a zmiňují některá fakta o formátu těchto souborů. Uvádějí některé příklady použití, jako je cat .
(ve cvičení 2-2).
Přinejmenším v Darwinu již adresáře nejsou čitelné jako soubory. Přinejmenším se při čtení zdají být soubory nulové délky.
Kdy k této změně došlo a existuje o ní nějaká oficiální dokumentace?
Přijatá odpověď:
Odkaz na číslo chyby z nejnovější specifikace POSIX (POSIX.1-2008) uvádí:
[EISDIR]
Je adresář. Byl učiněn pokus otevřít adresář se zadaným režimem zápisu.
To znamená, že na OS kompatibilním s POSIX byste měli být schopni číst() adresář, pokud jste jej otevřeli pouze pro čtení (O_RDONLY).
Právě jsem to zkusil na boxu NetBSD (který se opravdu zajímá o POSIX) a funguje podle očekávání, zatímco na GNU/Linuxu selhává s EISDIR (což by se nemělo stávat).
Rychlý pohled na Linux ukazuje, že je to zamýšleno (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;
}
I když jej konkrétní implementace souborového systému může přepsat (jako to dělá CEPH:http://lxr.free-electrons.com/source/fs/ceph/dir.c#L1142), výchozí chování je vrátit EISDIR, kdykoli se někdo pokusí read() adresář, i když je otevřený pouze pro čtení.
Vysledoval jsem tuto změnu zpět do 2.0.xa alespoň u souborového systému ext2 to stále platilo.
Takže ano, na OS kompatibilním s POSIX byste měli být schopni číst adresář, ale některá jádra (jako Linux a zřejmě i další) tuto podmínku prostě ignorují a porušují standard.