2

dup を使用して、開いているファイルのファイル記述子を複製するこのプログラムを試しました。

この同じファイルへのハード リンクを作成し、同じファイルを開いて、プログラム内のファイルの内容を読み取りました。

私の質問は、違いは何ですか?

dup がファイルへの実行時の抽象化を提供し、ハードリンクがファイルシステムの実装をより参照していることを理解していますが、一方を他方よりも使用する必要性を理解していません。

一方を他方よりも使用する利点は何ですか?

ファイル記述子を作成する代わりに同じファイルの場所を参照したい場合、またはその逆の場合に、ハード リンクを明示的に参照できないのはなぜですか?

Linux と標準の C ライブラリを使用しています。

4

3 に答える 3

3

ハード リンクはi ノードdup機能し、開いているファイル記述子で機能します。これらは異なる動物です。

ファイルは大部分が i ノードであり、その i ノードを指すディレクトリ エントリがあります (したがって、ハード リンクを介して複数の名前を持つファイルもあれば、まったく名前を持たないファイルもあります。一時ファイルは開いたままですが、リンクされていない i ノードが参照されます。開いているファイル記述子によって、しかしそれ以上の名前はありません)。I ノードはファイルの存続期間中存在し、ディスクに書き込まれます。

ファイル記述子はプロセス内 (ディスク上ではなくカーネル メモリ内のみ) にのみ存在するため、ディスクに書き込むことはできません (その番号を書き込むことしかできませんが、通常は意味がありません)。ファイル記述子は (カーネル内で) その inode を認識していますが、さらにいくつかの状態、特に現在のオフセットも認識しています。

2 つのファイル記述子が同じファイル (同じ inode、おそらくそれにopen2 つの異なるハードリンクまたはシンボリック リンクされたパスを -ing することによって) で動作するが、異なる状態 (たとえば、異なるファイル位置またはオフセット) を持つことができます。

dup(2) syscallを使用する場合、2 つのファイル記述子は同じ状態 (dup の直後) を共有します。特に、同じファイル オフセットまたは位置を共有します。

link(2) syscallを使用している場合、2 つのディレクトリ エントリは同じ inode を指します。それらは同じファイルシステム上にある必要があります。

そして、symlink(2)システムコールは、シンボリック名を参照する新しい i ノード (および新しいファイル) を作成します。path_resolution(7)symlink(7 )に関する他の man ページを読んでください。

于 2012-09-09T06:56:16.460 に答える
0

ハード リンクは、同じファイルを 2 つの異なるディレクトリに配置する方法にすぎません。ディスク容量を節約するのに便利です。

を使用fdupすると、同じファイルを指す 2 つの異なるファイル記述子をプログラムに含めることができます。ファイル記述子をラップするある種の論理オブジェクトを複製したい場合に便利です。

于 2012-09-09T06:59:06.773 に答える
0

主な違いは、ハード リンクは永続的であり、複製されたファイル記述子はプロセスの間のみ存続することです。さらに、すでに与えられた理由。

于 2012-09-09T07:30:30.120 に答える