2017-08-12 8 views
1

Linux上でシンボリックリンクを解決するアルゴリズムはどのように見えますか?シンボリックリンクアルゴリズムの解決

何かのように:ステップへ

  1. スプリットパス/usr/bin/hello - >['usr', 'bin', 'hello']

  2. まず決意/usr - >/something1

  3. 次のステップを追加し、解決/something1/bin - >/something2

  4. 次のステップを追加し、/something2/hello解決 - >/something3

することを仕事を?

+2

"解決"とは、シンボリックリンクが含まれていない同じファイルへのパスを形成することですか?その場合、(1)シンボリックリンクが別のシンボリックリンクを指すことができる、 (2)シンボリックリンクがマルチコンポーネントパス(シンボリックリンクを構成できるコンポーネントのどれか)を指すことができます。 (3)シンボリックリンクは絶対的でも相対的でもあります。 (4)シンボリックリンクが存在しないパスを指すことがあります。 –

+0

@JohnBollingerは再帰的に使用できますか? – Vad

+0

「再帰的」とはどういう意味ですか? – melpomene

答えて

1

あなたが実際に探しているのは、readlinkコマンドです。そのコマンドは、POSIX realpathに依存しています。そのアルゴリズムは、一冊の本に書かれたようhere

利用可能であるという考えはこれです:

すべてのパスの種類の解像度(チェック)処理はパスするかどうかを示すために、先頭のスラッシュ(/)の有無を使用しています絶対パスまたは相対パスです。スラッシュが存在する場合は、スラッシュの後の最初の修飾子をMVS接頭部と比較し、接頭部と一致するかどうかを判別します。そうであれば、パスタイプはプレフィックスを介して明示的に解決されると見なされます。一致するものが見つからなかった場合、またはスラッシュが存在しなかった場合は、暗黙のパス・タイプ解決のヒューリスティックが使用されます。

いくつかの詳細は、あなたがI/Oを要求したとき、基本的に、カーネルは一連のステップを経る必要があるにもhere

1

ご利用いただけます。カーネルは要求されたファイルのディレクトリを検索する必要がありますが、カーネルはルートファイルのinode番号が一定であるためカーネルはどこから開始するのかを常に知っているため、問題はありません。extシステムファミリのinode 2です。カーネルは、ディレクトリ内のファイル名を見つけたら、ファイル名をinode番号に変換します。各ディレクトリは(ファイル名、inode)フィールドを持つエントリを保持する特別な種類のファイルなので、ディレクトリを検索することによってカーネルはファイルのinodeを見つけることができます。

カーネルがファイルのinodeを見つけたら、このiノードはの通常ファイルのブロックアドレスを保持しているため、そのファイルに格納されているデータの場所を特定するために使用されます。ファイルのブロックアドレスは、ファイルに格納されている実際のデータを保持します。 *通常のファイルとsymlinkファイルの違いは、symlinkファイルは別の場所を指すファイルであるため、カーネルは同じ一連のステップを2回実行する必要があります。つまり、シンボリックリンクファイルのinodeが見つかった場合カーネルはsymlinkファイルが指すファイルパスに対して同じ操作をやり直さなければなりません。ディレクトリ内で検索し、ディレクトリ内で一致するファイル名を見つけてinode番号を取得する必要があります。これは明らかにオーバーヘッドを追加します。

再帰(a.kサイクリック)シンボリックリンクは無効なシンボリックリンクです。

私があなたの質問に答えたのかどうかはわかりませんが、それは一般的に起こることです。物理的なファイルシステムである上下のVFSレイヤーもあります。いくつかのファイルシステムは、vfatのようなシンボリックリンクをサポートしていません。