ext2目录条目清单:结束在哪里?

时间:2015-03-23 14:57:38

标签: c linux file unix ext2

ext2目录条目保留为linked list。引自1

  

目录文件是目录条目结构的链接列表。每个结构都包含条目的名称,与此条目的数据相关联的inode,以及目录文件中与下一个条目的距离。

但它没有说inode中有一个终结符。此外,没有任何字段可以告诉目录inode中有多少条目。

所以问题是:当您阅读inode数据结构时,您如何知道它何时到达列表末尾?

示例:假设一个空的根目录“/”。所以命令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时,您已从磁盘读取了根节点结构,然后按照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是1000而不是980.我纠正了它。

1 个答案:

答案 0 :(得分:2)

我明白了。目录的所有条目都应该适合大小固定的数据块。对于ext2,数据块为1024.

在上面的示例中,根节点仅指向单个数据块(即,i_blocks数组只有一个非零元素)。该数据块中的所有条目都属于root。除此之外,还有一些其他的目标。

{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个条目的所有rec_len值,12 + 12 + 1000 = 1024,则它已经是数据块大小。那是我正在寻找的哨兵信号。除此之外,它位于另一个目录的另一个数据块中。