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.