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

标签 c linux file unix ext2

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/

相关文章:

python - Tkinter.PhotoImage 不支持 png 图片

linux - 使用 AWK 比较两个不同的文件并将值从一个文件复制到另一个文件

linux - 被另一个用户移动后的当前目录

c++ - 读取大文件中一行的前 N ​​个字符的最快方法是什么?

c - 设置GNSDK开发环境-nmake不起作用

python - 数组+标量? C

c - c + linux的练习

c - 学习动态内存分配

c - 如何编写一个内核模块来查找内核中的路由表和arp缓存?

linux - 写入文件的 syslog() 消息