Quando le directory hanno smesso di essere leggibili come file?


29

Ho la prima edizione del libro The Unix Programming Environment. Nel capitolo 2, gli autori dichiarano che le directory sono leggibili come file e menzionano alcuni fatti sul formato di questi file. Forniscono alcuni esempi di utilizzo come cat .(nell'esercizio 2-2).

Almeno in Darwin, le directory non sono più leggibili come file. Almeno, sembrano essere file di lunghezza zero durante la lettura.

Quando si è verificato questo cambiamento e c'è qualche documentazione ufficiale al riguardo?


1
Ricordo che funzionava da qualche tempo, dal 1991 al 1995, su Sun Solaris. Penso che abbia smesso di funzionare anche per me da qualche parte in quel periodo di tempo. Quando siamo passati a macchine sparc con sistema V. (non ricordo bene). Probabilmente dipende dal file system. Se il file system non memorizza i dati esattamente come descritto, si interromperà a meno che non venga aggiunto un livello di compatibilità. Inoltre non funziona oggi usando Debian Gnu + Linux.
ctrl-alt-delor,

1
So che leggere una directory come file funzionava con Unix System V alla fine degli anni '80 - primi anni '90. Ha funzionato sotto SunOS. Funzionava con alcune versioni di Irix. Penso che passare al file system virtuale e consentire a molte organizzazioni di dischi sottostanti non sia possibile supportarlo in modo efficiente.
Bruce Ediger,

8
Ulteriori informazioni (non autorevoli) sono disponibili qui: utcc.utoronto.ca/~cks/space/blog/unix/ReaddirHistory
camh

Ho controllato su AIX e Solaris - anzi, su AIX puoi ancora cat .mentre su Solaris 11 (come in Linux) non puoi. Freddo.
gena2x,

Risposte:


13

Il riferimento al numero di errore dall'ultima specifica POSIX (POSIX.1-2008) indica:

[EISDIR]

È una directory. Tentativo di aprire una directory con la modalità di scrittura specificata.

Ciò significa che, su un sistema operativo compatibile con POSIX, dovresti essere in grado di leggere () una directory se l'hai aperta in sola lettura (O_RDONLY).

Ho appena provato questo su un NetBSD (a cui interessa davvero POSIX) e funziona come previsto, mentre non funziona su GNU / Linux con EISDIR (cosa che non dovrebbe accadere).

Una rapida occhiata a Linux mostra che è previsto ( 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;
}

Mentre un'implementazione concreta del filesystem può sovrascriverla (come fa CEPH: http://lxr.free-electrons.com/source/fs/ceph/dir.c#L1142 ), il comportamento predefinito è di restituire EISDIR ogni volta che qualcuno sta provando a read () una directory, anche se è aperta in sola lettura.

Ho fatto risalire questa modifica a 2.0.xe, almeno per il filesystem ext2, era ancora così.

Quindi, sì, su un sistema operativo compatibile con POSIX dovresti essere in grado di leggere una directory, ma alcuni kernel (come Linux e, apparentemente, altri) semplicemente ignorano questa condizione e infrangono lo standard.


6
Secondo Open Group, il comportamento di Linux qui è legale con un'estensione XSI allo standard . readdir(2)è più portatile. Ciò mi suggerisce che la risposta corretta alla domanda di OP è "Quando XSI è diventato popolare".
Kevin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.