【发布时间】:2019-12-10 03:30:46
【问题描述】:
在使用 C++ 包装器实现 FUSE 文件系统时,我遇到了readdir() 函数。这是我从passthrough.c 模仿的函数:
static int xmp_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
off_t offset, struct fuse_file_info *fi,
enum fuse_readdir_flags flags)
{
DIR *dp;
struct dirent *de;
(void) offset;
(void) fi;
(void) flags;
dp = opendir(path);
if (dp == NULL)
return -errno;
void* mybuf = malloc(10000);
while ((de = readdir(dp)) != NULL) {
struct stat st;
memset(&st, 0, sizeof(st));
st.st_ino = de->d_ino;
st.st_mode = de->d_type << 12;
if (filler(mybuf, de->d_name, &st, 0, 0))
break;
}
closedir(dp);
return 0;
}
(来源:https://github.com/libfuse/libfuse/blob/master/example/passthrough.c):
我的文件系统要求我在本地分配缓冲区,所以我没有使用参数化的void *buf,而是尝试像这样创建一个本地缓冲区:
void* buf = malloc(10000);
无论我分配了多大的缓冲区,当调用 filler() 时,我总是会遇到分段错误。作为一个控件,我尝试在完全工作的passthrough.c 示例中类似地分配一个本地缓冲区,但我仍然收到分段错误错误。这再次证实了我的问题在于缓冲区分配。
在filler() fuse 函数中分配要使用的缓冲区的正确方法是什么?
【问题讨论】:
-
通过 valgrind 运行您的代码。如果你的内存管理不善,它会告诉你在哪里。
-
缓冲区大小不是问题。这可能是您的
filler()代码的问题。 -
@PaulOgilvie 此代码直接取自我作为源提供的 libfuse
pasthrough.c示例。 void casts 在那里,所以编译器不会抱怨未使用的参数。 -
不过,filler 还是希望得到他原来的
buf。你不能覆盖它。你应该做的是写你自己的my_filler得到my_buf, buf, filler并在里面调用filler(buf) -
只有内部的
readdir调用是使用RPC 完成的吗?我了解您已读取远程位置。但是filler()不是在readdir返回后调用localy 吗?