ext2 ディレクトリ エントリは、リンクされたリストとして永続化されます。1からの引用:
ディレクトリ ファイルは、ディレクトリ エントリ構造のリンク リストです。各構造体には、エントリの名前、このエントリのデータに関連付けられた inode、および次のエントリまでのディレクトリ ファイル内の距離が含まれます。
しかし、iノードにターミネータがあるとは言いません。また、ディレクトリ i ノードにエントリがいくつあるかを示すフィールドはありません。
問題は、i ノードのデータ構造を読み取ったときに、リストの最後に到達したことをどのようにして知ることができるかということです。
例: 空のルート ディレクトリ "/" を想定します。したがって、コマンドは次のls
ように出力する必要があります。
drwxr-xr-x 4 junji junji 4096 Mar 23 10:33 .
drwxr-xr-x 7 junji junji 4096 Mar 23 10:27 ..
drwxr-xr-x 7 junji junji 4096 Mar 23 10:27 lost+found
を実装する場合ls
、ディスクからルート inode 構造体を読み込んでから、手順に従ってi_blocks
すべてのディレクトリ エントリを取得しようとします。ディスクでは、エントリ リストは実際には次のように保存されます。
{inode = 2, rec_len = 12, name_len = 1, name = .}
{inode = 2, rec_len = 12, name_len = 2, name = ..}
{inode = 12, rec_len = 1000, name_len = 6, name = lost+found}
{inode = 12, rec_len = 12, name_len = 1, name = .}
{inode = 2, rec_len = 32, name_len = 2, name = ..}
...
3 番目の「lost+found」エントリのすぐ隣に別のエントリがあります。
明らかに、プログラムは「lost+found」エントリで停止する必要があります。次のエントリ、つまり「.」だからです。別のディレクトリに属しています。しかし、どうすればプログラムにそれを知らせることができるでしょうか? ディレクトリ エントリ リストの最後だといつわかるのでしょうか。
ありがとう!
編集:
inode リストには少し矛盾があります。特に、rec_len
lost+found エントリの が 980 ではなく 1000 になっています。修正しました。