Odwołanie do numeru błędu z najnowszej specyfikacji POSIX (POSIX.1-2008) stwierdza:
[EISDIR]
Jest katalogiem. Podjęto próbę otwarcia katalogu z określonym trybem zapisu.
Oznacza to, że w systemie operacyjnym zgodnym z POSIX powinieneś mieć możliwość odczytu () katalogu, jeśli otworzysz go tylko do odczytu (O_RDONLY).
Właśnie próbowałem tego na komputerze NetBSD (który naprawdę dba o POSIX) i działa zgodnie z oczekiwaniami, podczas gdy nie działa na GNU / Linux z EISDIR (co nie powinno się zdarzyć).
Szybkie spojrzenie na Linuksa pokazuje, że jest to zamierzone ( 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;
}
Chociaż konkretna implementacja systemu plików może go zastąpić (podobnie jak CEPH: http://lxr.free-electrons.com/source/fs/ceph/dir.c#L1142 ), domyślnym zachowaniem jest zwracanie EISDIR za każdym razem, gdy ktoś próbuje read () katalog, nawet jeśli jest otwarty tylko do odczytu.
Prześledziłem tę zmianę z powrotem do wersji 2.0.x, a przynajmniej dla systemu plików ext2 nadal tak było.
Tak, tak, w systemie operacyjnym zgodnym z POSIX powinieneś być w stanie odczytać katalog, ale niektóre jądra (jak Linux i, najwyraźniej inne) po prostu ignorują ten warunek i łamią standard.