gpt4 book ai didi

c - ext2 目录条目列表 : Where is the end?

转载 作者:太空狗 更新时间:2023-10-29 11:13:36 25 4
gpt4 key购买 nike

ext2 目录条目被保存为 linked list .引自 1 :

A directory file is a linked list of directory entry structures. Each structure contains the name of the entry, the inode associated with the data of this entry, and the distance within the directory file to the next entry.

但是并没有说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时,您已经从磁盘中读取了根 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 = ..}
...

在第三个“失物招领”条目的旁边还有另一个条目。

很明显,程序应该在“lost+found”条目处停止,因为下一个条目即“.”属于另一个目录。但是我们如何让我们的程序知道呢?我们什么时候知道它是目录条目列表的末尾?

谢谢!

编辑:

inode 列表有点不一致。特别是,lost+found 条目的 rec_len 是 1000 而不是 980。我更正了它。

最佳答案

我想通了。目录的所有条目都应该适合大小固定的数据 block 。对于ext2,一个数据 block 是1024。

在上面的例子中,根 inode 只指向一个数据 block (即 i_blocks 数组只有一个非零元素)。该数据 block 中的所有条目都属于根。除此之外,它是其他一些目录。

{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,那么就已经是一个数据 block 大小了。这就是我一直在寻找的哨兵信号。除此之外,它位于另一个目录的另一个数据 block 中。

关于c - ext2 目录条目列表 : Where is the end?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29213455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com