Ссылка на номер ошибки из последней спецификации POSIX (POSIX.1-2008) гласит:
[EISDIR]
Это каталог. Предпринята попытка открыть каталог с указанным режимом записи.
Это означает, что в POSIX-совместимой ОС вы должны иметь возможность читать () каталог, если вы открыли его только для чтения (O_RDONLY).
Я только что попробовал это на коробке NetBSD (которая действительно заботится о POSIX), и работает как ожидалось, в то время как это терпит неудачу на GNU / Linux с EISDIR (что не должно происходить).
Беглый взгляд на Linux показывает, что это предназначено ( 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;
}
Хотя конкретная реализация файловой системы может переопределить ее (как это делает CEPH: http://lxr.free-electrons.com/source/fs/ceph/dir.c#L1142 ), поведение по умолчанию - возвращать EISDIR всякий раз, когда кто-то пытается read () каталог, даже если он открыт только для чтения.
Я проследил это изменение до версии 2.0.x, и, по крайней мере, для файловой системы ext2 это все еще имело место.
Итак, да, в POSIX-совместимой ОС вы должны иметь возможность читать каталог, но некоторые ядра (например, Linux и, очевидно, другие) просто игнорируют это условие и нарушают стандарт.