web-dev-qa-db-ja.com

iノード番号とファイル記述子の違いは何ですか?

ファイル記述子はファイルを識別するためのカーネルハンドルであり、ファイルのiノード番号はファイルに関する他の詳細を持つ構造体へのポインターであることを理解しています(間違っている場合は修正してください)。しかし、私はそれらの違いを理解することができません。

13
rgaut

inode は、特定のファイルシステムのアーティファクトであり、間接参照を管理する方法です。 「従来の* ix」ファイルシステムは、これを使用してファイルをディレクトリにリンクし、ファイルの複数の部分をリンクします。つまり、iノードはファイルシステム実装の物理的表現を表します。

一方、a ファイル記述子 は開いているファイルの不透明な識別子ですカーネルによる。ファイルが開いたままである限り、その識別子を使用して読み取りや書き込みなどの操作を実行できます。ここでの「ファイル」の使用法はnot一般的な「ディスク上のファイル」と混同されます-むしろ、このコンテキストのファイルは、ストリームと、それに関係なく実行できる操作を表します。ソース。

ファイル記述子はnot iノードに関連していますが、特定の[file-system]ドライバーによって内部的に使用される場合があります。

15
user2864740

違いは実質的ではなく、どちらも「ファイル」と呼ばれる抽象的な用語に関連しています。 iノードはファイルを表すファイルシステム構造です。一方、ファイル記述子はopensyscallによって返される整数です。定義により:

ファイルはiノードで表されます。ファイルのiノードは、ファイルシステムによって保持される構造であり、ファイルのタイプ、所有者、アクセス許可、iノードリンク数などのファイルに関する情報を保持します。

一方、ファイル記述子

ファイル記述子open呼び出しによって返される値はファイル記述子と呼ばれ、本質的にはカーネルによって保持されている開いているファイルの配列へのインデックスです。

カーネルは開いているファイルを名前で表すのではなく、プロセスごとに開いているファイルのエントリの配列を使用するため、ファイル記述子は事実上、開いているファイルの配列へのインデックスです。たとえば、プロセスで次の操作を実行していると仮定します。

_read(0, 10)
_

0はファイル記述子番号を示し、10は10バイトを読み取ります。この場合、プロセスはインデックス0のファイル/ストリームから10バイトを要求します。これはstdinです。カーネルは、各プロセスに3つのオープンストリームを自動的に付与します。

_Descriptor No. 
      0  --->          stdin
      1  --->          stdout
      2  --->          stderr
_

これらの記述子は、カーネルから無料で提供されます。

これで、ファイルを開くと、open("/home/myname/file.txt") syscallを介したプロセスで、新しく開いたファイルのインデックス3が作成され、別のファイルを開くと、インデックス4が取得されます。これらは、プロセスで開かれたファイルの記述子です。

_ Descriptor No. 
      0  --->           stdin
      1  --->           stdout
      2  --->           stderr
      3  --->           /home/user100/out.txt  
      4  --->           /home/user100/file.txt
_

OPEN(2)を参照してください。これは、openを呼び出したときに表面の下に何が表示されるかを説明しています。

10
direprobs