プログラマーのためのリンク

リンクはファイル名と i ノード間の接続 (ハード・リンク) またはファイル名間の接続 (シンボリック・リンク) です。

リンクによって、複数のファイル名からの i ノードへのアクセスが可能になります。 ディレクトリー・エントリーは、ファイル名と i ノードをペアにします。 ファイル名はユーザーが識別しやすい名前であり、i ノードには、 ファイルのデータの実ディスク・アドレスが入っています。 i ノードへのすべてのリンクの参照カウントは、i ノードの i_nlink フィールドに保持されます。 リンクを作成および破棄するサブルーチンは、 ファイル・ディスクリプターではなくファイル名を使用します。 したがって、リンクを作成する場合にファイルをオープンする必要はありません。

プロセスは、リンク済みのいずれかのファイル名を使用して、i ノードの内容のアクセスおよび変更を行うことができます。 AIX®はハードリンクとシンボリックリンクをサポートしています。

ハード・リンク

サブルーチン 説明
リンク ハード・リンクを作成するサブルーチン。 ハード・リンクがあると、そのハード・リンクによって、i ノードの i_nlink フィールドのリンク・カウントが増加するので、ファイルの存在が確実化されます。
リンク解除 リンクを解放するサブルーチン。 i ノードへのすべてのハード・リンクが解放されると、 ファイルはアクセス可能でなくなります。

i ノード番号は単一のファイルシステムを基準にしているので、 ハード・リンクは同じファイルシステム内のファイル名と i ノードをリンクする必要があります。 ハード・リンクによって作成されるディレクトリー・エントリーは、 新しいファイル名と i ノードをペアにするので、 ハード・リンクは常に特定のファイルを参照します。 元のファイルを作成したユーザー ID が、ファイルを所有し、 ファイルに関するアクセス・モード権限を保持します。 それ以外の場合、すべてのハード・リンクはオペレーティング・システムによって平等に処理されます。

例: /u/tom/bob ファイルが /u/jack/foo ファイルにリンクされている場合、 foo ファイルの i_nlink フィールドのリンク・カウントは次のようになります。2. 両方のハード・リンクが等しい。 /u/jack/foo を除去すると、 ファイルは /u/tom/bob という名前で存在し続け、 tom ディレクトリーへアクセスできるユーザーによってアクセス可能です。 ただし、ファイルの所有者は以下のようになります。jackただし、 /u/jack/foo は削除されています。 このファイルが占有するスペースは、ジャックのクォータ・アカウントに課金されます。 ファイル所有権を変更するには、 chown サブルーチンを使用します。

シンボリック・リンク

シンボリック・リンクは、 symlink コマンドを使用して、パス名を含むファイルとして実装されます。 プロセスがシンボリック・リンクを検出すると、 シンボリック・リンクに入っているパスが、 プロセスが検索していたパスの前に付けられます。 シンボリック・リンク内のパス名が絶対パス名であれば、 プロセスは指定されたファイルをルート・ディレクトリーで検索します。 シンボリック・リンク内のパス名が / (スラッシュ) で始まっていない場合、 プロセスは、パスの残りの部分を、シンボリック・リンクの位置を基準として解釈します。 unlink サブルーチンはシンボリック・リンクも除去します。

シンボリック・リンクは、オペレーティング・システムによって、 ファイルシステム構造体の一部としてではなく、通常のファイルとして処理されるので、 ファイルシステム内を移動することができます。 シンボリック・リンクが存在しても、シンボリック・リンクが i ノードの i_nlink フィールドに影響を与えないので、 ターゲット・ファイルが存在するとは限りません。

サブルーチン 説明
readlink シンボリック・リンクの内容を読み取るサブルーチン。 多くのサブルーチン ( open および stat サブルーチンを含む) は、シンボリック・パスをたどります。
lstat シンボリック・リンクの入ったファイルの状況について報告するために作成されたサブルーチンであり、 リンクを通過することはしません。 シンボリック・リンクを通過するサブルーチンのリストについては、 symlink サブルーチンを参照してください。

シンボリック・リンクは、パス名によってファイルにリンクするので、 ソフト・リンクとも呼ばれます。 ターゲット・ファイルの名前を変更するか、または 除去した場合、シンボリック・リンクは解決できません。

例: /u/joe/foo へのシンボリック・リンクは、 リテラル・データ /u/joe/foo が入っているファイルです。 foo ファイルのオーナーがこのファイルを除去すると、 このシンボリック・リンクに対するサブルーチン・コールは失敗します。 次に、ファイル・オーナーが、 同じディレクトリーに foo という名前の新しいファイルを作成すると、 このシンボリック・リンクは新しいファイルに導きます。 したがって、このリンクは、交換可能 i ノードにリンクされるので、 ソフト・リンクと見なされます。

ls-lコマンドのリストではl最初の位置は、リンクされたファイルを示します。 そのリストの最後の列では、ファイル間のリンクは次のように表されます。Path2 -> Path1(または Newname -> Oldname).

サブルーチン 説明
削除 unlink または rmdir サブルーチンを呼び出すことによって、 ファイル名も除去するサブルーチン。

ディレクトリー・リンク

サブルーチン 説明

ディレクトリーへの追加のリンクを作成するには、 シンボリック・リンクをお勧めします。 シンボリック・リンクは、.. および ... 空の正しい形式のディレクトリー状況を維持します。 空の適格なディレクトリー /u/joe/foo および i_nlink 値の例は、次のとおりです。

/u
空の値 空の値 Directory
68     j o e 0
/u/joe
mkdir ("foo", 0666)
空の値 空の値 Directory
68     n 0 0 0
      n n 0 0
235     f o o 0

 

/u/joe/foo
空の値 空の値 Directory
235     n 0 0 0
68     n n 0 0
i_nlink Values

i = 68

n_link 3

i = 68 の場合、n_link 値は 3 です (/u; /u/joe; /u/joe/foo)。

i = 235

n_link 2

i = 235 の場合、n_link 値は 2 です (/u/joe; /u/joe/foo)。