0

我正在用 C 语言编写一些软件,它递归地列出给定目录中的所有文件,现在我需要解决内部碎片问题。

我花了很长时间研究这个,发现ext2上的内部碎片只发生在最后一个块中。我知道从理论上的 inode 编号你应该能够获得第一个和最后一个块地址,但我不知道如何。

我已经研究过stat()fcntl()以及各种方式。如何从 inode 号中获取最后一个块地址?

我还发现,一旦我有了最后一个块的地址,我就可以测试该块中有多少可用空间,这会给我内部碎片。

我知道有一个get_inode和一个get_block命令,但除此之外一无所知!

4

2 回答 2

1

我认为您无法通过常规系统调用(例如stat(). 您可能必须在磁盘上找到原始 inode(这意味着访问原始磁盘,并且需要提升的权限)并从那里处理数据。

经典地,您会发现文件的直接块、间接块、双重间接块和三重间接块。但是,相关的文件系统类型与渡渡鸟一样已死(我认为我在这个千年没有见过这种文件系统类型),所以现在不太可能有太大帮助。

可能有一个非标准的系统调用来获取信息,但我对此表示怀疑。

于 2011-12-11T20:59:42.383 回答
1

可能你想的太复杂了,但是如果将文件大小除以块大小并取模,大致内部碎片应该可以计算出来。

但这仅在文件是“经典文件”时才有效——稀疏文件或包含大量“其他信息”(例如巨大的 ACL 或扩展属性)的文件可能会有所不同。(我不知道它们存储在哪里,但我可以想象可能有文件系统将它们存储在最后一个块中,有效地(但不被注意地)减少了内部碎片。)

于 2011-12-12T07:54:37.533 回答