ディレクトリがファイルとして読み込めなくなるのはいつですか?


29

Unixプログラミング環境の本の第1版があります。第2章では、作成者はディレクトリがファイルとして読み取り可能であると述べ、これらのファイルの形式に関するいくつかの事実に言及しています。cat .(演習2-2)などの使用例を示します。

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

この変更はいつ発生し、それに関する公式文書はありますか?


1
1991年9月から1995年6月にかけて、太陽のソラリスで働いていたことを覚えています。私もその期間のどこかで機能しなくなったと思います。システムVでsparcマシンにアップグレードしたとき(よく覚えていない)。おそらくファイルシステムに依存します。ファイルシステムが記述されたとおりにデータを保存しない場合、互換性レイヤーが追加されない限り壊れます。また、Debian Gnu + Linuxを使用して今日は機能しません。
ctrl-alt-delor 14

1
ディレクトリをファイルとして読み取ることは、80年代後半から90年代前半にUnix System Vで機能することを知っていました。SunOSで動作しました。Irixの一部のバージョンで機能しました。仮想ファイルシステムに移行し、多くの基盤となるディスク組織を許可することは、これを実際に効率的にサポートできないことを意味すると思います。
ブルースエディガー14

8
詳細(権限のない)情報は、ここにあります:utcc.utoronto.ca/~cks/space/blog/unix/ReaddirHistory
camh

AIXとSolarisで確認しました-実際、AIXではできますがcat .、Solaris 11では(Linuxのように)できません。クール。
gena2x 14

回答:


13

最新の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など)はこの条件を無視して標準を破ります。


6
Open Groupによると、ここでのLinuxの動作は、標準に対するXSI拡張の下合法です。 readdir(2)よりポータブルです。それは私にOPの質問に対する正しい答えが「XSIが普及したとき」であることを示唆しています。
ケビン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.