Wann sind Verzeichnisse nicht mehr als Dateien lesbar?

29

Ich habe die 1. Ausgabe des Buches The Unix Programming Environment. In Kapitel 2 geben die Autoren an, dass Verzeichnisse als Dateien lesbar sind, und erwähnen einige Fakten zum Format dieser Dateien. Sie geben einige Anwendungsbeispiele wie cat .(in Übung 2-2).

Zumindest in Darwin sind Verzeichnisse nicht mehr als Dateien lesbar. Zumindest scheinen sie beim Lesen keine Länge zu haben.

Wann ist diese Änderung eingetreten, und gibt es eine offizielle Dokumentation darüber?

Tyler
quelle
1
Ich erinnere mich, dass es irgendwann zwischen 1991 und 1995 auf Sun Solaris lief. Ich denke, es hat irgendwo in dieser Zeit auch aufgehört, für mich zu arbeiten. Als wir auf Sparc-Maschinen mit System V umgestiegen sind (kann mich nicht gut erinnern). Es hängt wahrscheinlich vom Dateisystem ab. Wenn das Dateisystem die Daten nicht genau wie beschrieben speichert, kommt es zu einer Unterbrechung, sofern keine Kompatibilitätsebene hinzugefügt wird. Funktioniert auch heute nicht mit Debian Gnu + Linux.
Strg-Alt-Delor
1
Ich weiß, dass das Lesen eines Verzeichnisses als Datei in den späten 80ern - frühen 90ern unter Unix System V funktioniert hat. Es hat unter SunOS funktioniert. Es funktionierte unter einigen Versionen von Irix. Ich denke, dass der Wechsel zum virtuellen Dateisystem und das Zulassen vieler zugrunde liegender Datenträgerorganisationen bedeuten, dass Sie dies nicht wirklich effizient unterstützen können.
Bruce Ediger
8
Weitere (nicht maßgebliche) Informationen finden Sie hier: utcc.utoronto.ca/~cks/space/blog/unix/ReaddirHistory
camh
Ich habe unter AIX und Solaris nachgesehen. Unter AIX können Sie dies immer noch tun, cat .während dies unter Solaris 11 (wie unter Linux) nicht möglich ist. Cool.
Gena2x

Antworten:

13

Die Fehlernummernreferenz aus der neuesten POSIX-Spezifikation (POSIX.1-2008) besagt:

[EISDIR]

Ist ein Verzeichnis. Es wurde versucht, ein Verzeichnis mit dem angegebenen Schreibmodus zu öffnen.

Dies bedeutet, dass Sie auf einem POSIX-kompatiblen Betriebssystem ein Verzeichnis lesen () können sollten, wenn Sie es schreibgeschützt geöffnet haben (O_RDONLY).

Ich habe dies gerade auf einer NetBSD-Box (die sich wirklich um POSIX kümmert) versucht und es 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 sie überschreiben kann (wie dies CEPH tut: http://lxr.free-electrons.com/source/fs/ceph/dir.c#L1142 ), ist das Standardverhalten, EISDIR zurückzugeben, wann immer jemand versucht, dies zu tun read () ein Verzeichnis, auch wenn es schreibgeschützt geöffnet ist.

Ich habe diese Änderung auf 2.0.x zurückverfolgt, und zumindest für das ext2-Dateisystem war dies immer noch der Fall.

Ja, auf einem POSIX-kompatiblen Betriebssystem sollte es möglich sein, ein Verzeichnis zu lesen, aber einige Kernel (wie Linux und anscheinend andere) ignorieren diese Bedingung einfach und brechen den Standard.

Sergio L. Pascual
quelle
6
Laut der Open Group ist das Verhalten von Linux unter einer XSI-Erweiterung des Standards legal . readdir(2)ist tragbarer. Das lässt darauf schließen, dass die richtige Antwort auf die Frage von OP "Als XSI populär wurde" lautet.
Kevin