ハード リンクはi ノードでdup
機能し、開いているファイル記述子で機能します。これらは異なる動物です。
ファイルは大部分が i ノードであり、その i ノードを指すディレクトリ エントリがあります (したがって、ハード リンクを介して複数の名前を持つファイルもあれば、まったく名前を持たないファイルもあります。一時ファイルは開いたままですが、リンクされていない i ノードが参照されます。開いているファイル記述子によって、しかしそれ以上の名前はありません)。I ノードはファイルの存続期間中存在し、ディスクに書き込まれます。
ファイル記述子はプロセス内 (ディスク上ではなくカーネル メモリ内のみ) にのみ存在するため、ディスクに書き込むことはできません (その番号を書き込むことしかできませんが、通常は意味がありません)。ファイル記述子は (カーネル内で) その inode を認識していますが、さらにいくつかの状態、特に現在のオフセットも認識しています。
2 つのファイル記述子が同じファイル (同じ inode、おそらくそれにopen
2 つの異なるハードリンクまたはシンボリック リンクされたパスを -ing することによって) で動作するが、異なる状態 (たとえば、異なるファイル位置またはオフセット) を持つことができます。
dup(2) syscallを使用する場合、2 つのファイル記述子は同じ状態 (dup の直後) を共有します。特に、同じファイル オフセットまたは位置を共有します。
link(2) syscallを使用している場合、2 つのディレクトリ エントリは同じ inode を指します。それらは同じファイルシステム上にある必要があります。
そして、symlink(2)システムコールは、シンボリック名を参照する新しい i ノード (および新しいファイル) を作成します。path_resolution(7)とsymlink(7 )に関する他の man ページを読んでください。