最新のPOSIX仕様(POSIX.1-2008)のエラー番号リファレンスには次のように記載されています。
[EISDIR]
ディレクトリです。書き込みモードが指定されたディレクトリを開こうとしました。
これは、POSIX準拠のOSでは、読み取り専用(O_RDONLY)で開いた場合、ディレクトリをread()できることを意味します。
NetBSD(これはPOSIXを本当に気にしています)ボックスでこれを試したところ、期待どおりに動作しますが、EISDIRを使用してGNU / Linuxで失敗します(これは起こりません)。
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準拠のOSではディレクトリを読み取ることができるはずですが、一部のカーネル(Linuxなど)はこの条件を無視して標準を破ります。