GNU/Linux >> Znalost Linux >  >> Linux

Kdy přestaly být adresáře čitelné jako soubory?

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.


Linux
  1. Najít největší soubory nebo adresáře?

  2. Když spustitelné soubory nejsou?

  3. Linux Odstraňte soubory a adresáře

  1. Maximální počet souborů/adresářů na Linuxu?

  2. Jak ignorovat adresáře/soubory v Subversion?

  3. Přesunout soubory do adresářů na základě přípony

  1. Kopírování souborů a adresářů v Linuxu

  2. Najděte adresáře obsahující určitý počet souborů

  3. Jak mohu ignorovat soubory/adresáře při sestavování balíčků debianu?