Ho la prima edizione del libro L'ambiente di programmazione Unix. Nel capitolo 2, gli autori affermano 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 quando vengono letti.
Quando si è verificata questa modifica e c'è della documentazione ufficiale a riguardo?
Risposta accettata:
Il riferimento al numero di errore dall'ultima specifica POSIX (POSIX.1-2008) afferma:
[EISDIR]
È una directory. Tentativo di aprire una directory con la modalità di scrittura specificata.
Ciò significa che, su un sistema operativo conforme a POSIX, dovresti essere in grado di leggere() una directory se l'hai aperta in sola lettura (O_RDONLY).
L'ho appena provato su una scatola NetBSD (che si preoccupa davvero di POSIX) e funziona come previsto, mentre fallisce su GNU/Linux con EISDIR (cosa che non dovrebbe accadere).
Una rapida occhiata a Linux mostra che questo è inteso (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 è restituire EISDIR ogni volta che qualcuno sta cercando di read() una directory, anche se è aperta in sola lettura.
Ho fatto risalire questa modifica alla 2.0.x e, almeno per il filesystem ext2, era ancora così.
Quindi, sì, su un sistema operativo conforme a POSIX dovresti essere in grado di leggere una directory, ma alcuni kernel (come Linux e, a quanto pare, altri) ignorano semplicemente questa condizione e infrangono lo standard.