web-dev-qa-db-ja.com

ディレクトリはどのように「特別な種類のファイル」ですか?

私は このUnixチュートリアル を読んでいて、この引用に出くわしました...

ここで、ディレクトリは特別なタイプのファイルにすぎないことに注意してください。

...しかし、説明や詳細は提供されていません。ディレクトリは実際には単なるファイルですか?

24
gwg

* nixスタイル(およびその他)のオペレーティングシステムの多くのエンティティは、ファイルシステムに格納されているバイトのシーケンスであるとは限りませんが、ファイルと見なされるか、ファイルのような定義の側面を持っています。ディレクトリがどのように実装されるかは、ファイルシステムの種類によって異なりますが、一般的に、ディレクトリに含まれるものはリストと見なされ、格納されたバイトのシーケンスであるため、その意味では特別ではありません。

* nixコンテキストで「ファイル」が何であるかを定義する1つの方法は、ファイル記述子を持つものであることです関連付けられています。ウィキペディアの記事によると、ファイル記述子

パイプまたはネットワーク接続などのファイルまたはその他の入出力リソースにアクセスするために使用される抽象的なインジケーターです...

つまり、バイトのシーケンスの読み取り/書き込みが可能なさまざまな種類のリソースを指しますが、そのシーケンスのソース/宛先は指定されていません。言い換えると、リソースの「場所」は何でもかまいません。それを定義するのは、それが情報の導管であることです。これは、UNIXで「すべてがファイルである」と言われることがある理由の一部です。あなたはそれを完全に文字通りとるべきではありませんが、真剣に検討する価値があります。ディレクトリの場合、この情報はディレクトリにあるもの、および下位の実装レベルではファイルシステム内でそれを見つける方法に関するものです。

ディレクトリは、ネイティブCコードでは表面上はファイル記述子に関連付けられていないため、この意味で特別なものです。 POSIX APIは、特殊なタイプのストリームハンドルDIR*を使用します。ただし、このタイプには実際には基礎となる記述子 取得可能 があります。記述子はカーネルによって管理され、それらへのアクセスには常にシステムコールが含まれます。したがって、記述子とは別の側面として、OSカーネルによって制御されるコンジットです。これらには、0で始まる一意の(プロセスごとの)番号があり、これは通常 標準入力 ストリームの記述子です。

19
goldilocks

Unixのやり方:すべてはファイルです。

ディレクトリは、(多くの)種類の特殊ファイルの1つです。データは含まれていません。代わりに、ディレクトリ内に含まれているすべてのファイルへのポインタが含まれています。

その他の種類の特殊ファイル:

  • リンク
  • ソケット
  • デバイス

ただし、これらは「ファイル」と見なされるため、それらをlsして名前を変更し、それらを移動できます。また、特殊ファイルのタイプに応じて、それらの間でデータを送受信できます。

13
hymie

私の答えは単なる回想ですが、199xのヴィンテージUnixでは、ディレクトリがファイルであり、ディスク上のiノードのどこかに「ディレクトリ」とマークされていました。

open(".", O_RDONLY)のようなものでディレクトリを開き、使用可能なファイル記述子を取得できます。 /usr/includeを調べて、正しいC構造体定義を見つけた場合、コンテンツを解析できます。 SunOS 4.1.xシステム、SGIのEFSファイルシステム、そしておそらくBSD4.2 FFSのファイルシステム用にDECのMips-CPUワークステーションが持っていたもので、これを実行したことは知っています。

それは悪い経験でした。仮想ファイルシステムレイヤーで標準化することは、たとえディレクトリが厳密なファイルではなくなったとしても、移植性にとっては良いことです。 VFSレイヤーを使用すると、ディレクトリがReiserFSやNFSなどのファイルではないファイルシステムを試すことができます。

11
Bruce Ediger

ディレクトリは、そのモードに「d」があるという点で特別であり、ファイルシステムに、その内容を、バイトのシーケンスである通常のファイルではなく、ディレクトリ内に含まれる他のファイルのリストとして解釈するように指示しますアプリケーションによって読み取られます。以上です。

3
psusi

Linuxシステムはniversal i/o modelを採用しているため、ディレクトリはファイルです。モデルでは、システム内のすべてがファイルであり、同じシステムコールとさまざまなコマンドでアクセスできます。

それらのiノードにはファイルタイプのマークがあり、ファイル名と他のiノードへのリンクのテーブルであるという特別な構造を持つため、これらは特別なタイプです。ディレクトリのiノードにあるこれらのファイル名とリンクのペアは、「ハードリンク」とも呼ばれ、ディレクトリの「内部」にあるファイルを列挙します。

ディレクトリは単にファイルを整理するためのものです。ファイルがディレクトリから別のディレクトリに「移動」されても、ファイル自体はディスクに再配置されません。 1つのディレクトリiノードのエントリが削除され、別のディレクトリiノードに書き込まれるだけです。

2