gpt4 book ai didi

linux - fuse:在 readdir 中设置填充函数的偏移量

转载 作者:太空狗 更新时间:2023-10-29 11:04:32 24 4
gpt4 key购买 nike

我正在使用 fuse 实现一个虚拟文件系统,需要了解 readdir 中的偏移参数。

之前我们忽略偏移量并在填充函数中传递 0,在这种情况下内核应该注意。

我们的文件系统数据库正在存储:目录名称、文件长度、inode 编号和父 inode 编号。

我如何计算得到偏移量?

那么每个组件的偏移量是否等于它们的大小以它们的 inode 号的递增形式排序?如果一个目录中有一个目录会发生什么情况,在这种情况下偏移量是否等于内部文件的总和?

Example: in case the dir listing is - a.txt b.txt c.txt
And inode number of a.txt=3, b.txt=5, c.txt=7

Offset of a.txt= directory offset
Offset of b.txt=dir offset + size of a.txt
Offset of c.txt=dir offset + size of b.txt

以上假设是否正确?

附言:Here are the callbacks of fuse

最佳答案

选择的答案不正确

尽管此答案没有赞成票,但这是正确答案。不鼓励破解 void 缓冲区的格式,这就是在 C 代码中声明此类内容 void 背后的意图 - 你不应该编写假设知识的代码void 指针后面的数据格式,请改用正确提供的任何 API。

下面的代码非常简单明了,理应如此。不需要了解 Fuse 缓冲区的格式。

虚构API

这是某些设备的 API 外观的人为示例喜欢。这不是 Fuse 的一部分。

// get_some_file_names() - 
// returns a struct with buffers holding the names of files.
// PARAMETERS
// * path - A path of some sort that the fictitious device groks.
// * offset - Where in the list of file names to start.
// RETURNS
// * A name_list, it has some char buffers holding the file names
// and a couple other auxiliary vars.
//
name_list *get_some_file_names(char *path, size_t offset);

分部分列出文件

这是一个可以注册到 Fuse 系统的 Fuse 回调列出 get_some_file_names() 提供的文件名。它被任意命名为 readdir_callback(),所以它的目的很明显。

int readdir_callback(      char  *path, 
void *buf, // This is meant to be "opaque".
fuse_fill_dir_t *filler, // filler takes care of buf.
off_t off, // Last value given to filler.
struct fuse_file_info *fi )
{
// Call the fictitious API to get a list of file names.
name_list *list = get_some_file_names(path, off);

for (int i = 0; i < list->length; i++)
{
// Feed the file names to filler() one at a time.
if (filler(buf, list->names[i], NULL, off + i + 1))
{
break; // filler() returned 1, requesting a break.
}
incr_num_files_listed(list);
}

if (all_files_listed(list))
{
return 1; // Tell Fuse we're done.
}

return 0;
}

off(偏移量)值不被填充函数使用来填充其不透明缓冲区,buf。但是,off 值对于作为偏移量基础的回调有意义,因为它向 filler() 提供文件名。 上次传递给 filler() 的值将在下一次调用时传递回 readdir_callback() filler() 本身只关心off的值是0还是not-0

表示“我已完成列表!”融合

向 Fuse 系统发出信号,表明您的 readdir_callback() 已完成部分文件名的列出(当名称列表的最后一个已提供给 filler()),只需从中返回 1

如何使用off

off,offset,参数应该是非0来执行部分列表。就 filler() 而言,这是它的唯一要求。如果 off0,则向 Fuse 表明您将一次完成完整列表(见下文)。

尽管 filler() 不关心 off 的值是多少,但它不是 0,该值仍然可以是有意义的用过的。上面的代码使用它自己的文件列表中下一项的索引作为它的值。 Fuse 会在每次调用时将它收到的最后一个 off 值传回 read dir 回调,直到列表完成(当 readdir_callback() 返回 1).

一次列出所有文件

int readdir_callback(      char  *path, 
void *buf,
fuse_fill_dir_t *filler,
off_t off,
struct fuse_file_info *fi )
{
name_list *list = get_all_file_names(path);

for (int i = 0; i < list->length; i++)
{
filler(buf, list->names[i], NULL, 0);
}
return 0;
}

如上所示,一次列出所有文件更简单 - 但不是很多。请注意,对于完整列表,off0。有人可能想知道,“为什么还要费心使用第一种分段读取文件夹内容的方法?”

在为文件名分配了一定数量的缓冲区并且文件夹中的文件数量可能超过此数量的情况下,部分策略很有用。例如, 的实现上面的 name_list 可能只有 8 个分配的缓冲区 (char names[8][256])。此外,如果一次给出的名称太多,buf 可能会填满并且 filler() 开始返回 1。第一种方法避免了这种情况。

关于linux - fuse:在 readdir 中设置填充函数的偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23565151/

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