私はUnixプログラミング環境の本の第1版を持っています。第2章では、作成者はディレクトリがファイルとして読み取り可能であると述べ、これらのファイルの形式に関するいくつかの事実に言及しています。 cat .
などの使用例を示します。 (演習2-2)。
少なくともダーウィンでは、ディレクトリをファイルとして読み取ることはできなくなりました。少なくとも、読み取ったときに長さがゼロのファイルのように見えます。
この変更はいつ発生しましたか。また、それに関する公式のドキュメントはありますか?
承認された回答:
最新の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や、明らかに他のカーネルなど)は、この条件を無視して標準に違反しています。