web-dev-qa-db-ja.com

ディレクトリがファイルとして読み取れなくなったのはいつですか?

『Unix Programming Environment』の第1版を持っています。第2章では、作成者はディレクトリはファイルとして読み取り可能であり、これらのファイルの形式に関するいくつかの事実について言及しています。 cat .(演習2-2)などの使用例を示します。

少なくともダーウィンでは、ディレクトリはファイルとして読み取ることができなくなりました。少なくとも、読み取られたとき、それらは長さがゼロのファイルのように見えます。

この変更が発生したのはいつで、それに関する公式のドキュメントはありますか?

29
Tyler

最新のPOSIX仕様(POSIX.1-2008)のエラー番号リファレンスには、次のように記載されています。

[EISDIR]

ディレクトリです。書き込みモードを指定してディレクトリを開こうとしました。

つまり、POSIX準拠のOSでは、ディレクトリを読み取り専用(O_RDONLY)で開いた場合、そのディレクトリをread()できるはずです。

私はこれを(本当にPOSIXを気にする)NetBSDボックスで試してみましたが、期待どおりに動作しますが、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 )、デフォルトの動作はディレクトリが読み取り専用で開かれている場合でも、誰かがディレクトリをread()しようとするたびにEISDIRを返します。

私はこの変更を2.0.xまでさかのぼって追跡しましたが、少なくともext2ファイルシステムについては、これは依然として事実でした。

したがって、はい、POSIX準拠のOSではディレクトリを読み取ることができるはずですが、一部のカーネル(Linuxなど、明らかに他のカーネル)はこの条件を無視して標準を破ります。

13