Ich habe die 1. Ausgabe des Buches The Unix Programming Environment. In Kapitel 2 stellen die Autoren fest, dass Verzeichnisse als Dateien lesbar sind, und erwähnen einige Fakten über das Format dieser Dateien. Sie geben einige Verwendungsbeispiele wie cat .
(in Übung 2-2).
Zumindest in Darwin sind Verzeichnisse nicht mehr als Dateien lesbar. Zumindest scheinen sie beim Lesen leere Dateien zu sein.
Wann trat diese Änderung auf und gibt es offizielle Dokumente darüber?
Akzeptierte Antwort:
Die Fehlernummerreferenz aus der neuesten POSIX-Spezifikation (POSIX.1-2008) lautet:
[EISDIR]
Ist ein Verzeichnis. Es wurde versucht, ein Verzeichnis mit angegebenem Schreibmodus zu öffnen.
Das bedeutet, dass Sie auf einem POSIX-kompatiblen Betriebssystem in der Lage sein sollten, ein Verzeichnis zu lesen(), wenn Sie es nur lesend geöffnet haben (O_RDONLY).
Ich habe dies gerade auf einer NetBSD-Box (die sich wirklich um POSIX kümmert) ausprobiert und funktioniert wie erwartet, während es unter GNU/Linux mit EISDIR fehlschlägt (was nicht passieren sollte).
Ein kurzer Blick auf Linux zeigt, dass dies beabsichtigt ist (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;
}
Während eine konkrete Dateisystemimplementierung es überschreiben kann (wie es CEPH tut:http://lxr.free-electrons.com/source/fs/ceph/dir.c#L1142), besteht das Standardverhalten darin, EISDIR zurückzugeben, wann immer jemand dies versucht read() ein Verzeichnis, auch wenn es nur zum Lesen geöffnet ist.
Ich habe diese Änderung bis 2.0.x zurückverfolgt, und zumindest für das ext2-Dateisystem war dies immer noch der Fall.
Also, ja, auf einem POSIX-kompatiblen Betriebssystem sollten Sie in der Lage sein, ein Verzeichnis zu lesen, aber einige Kernel (wie Linux und anscheinend andere) ignorieren diese Bedingung einfach und brechen den Standard.