这是一个真正的WTF情况......我生气了吗??
我注意到我的FUSE读取操作在我更新代码以阻止我的linter抱怨之后开始用零填充缓冲区:
int cramp_read(const char* path, char* buf, size_t size, off_t offset, struct fuse_file_info* fi) {
int res = 0;
struct my_filep* f = get_filep(fi);
(void)path;
if (f) {
switch (f->type) {
case fd_normal:
if (pread(f->filep, buf, size, offset) == -1) {
res = -errno;
}
break;
case fd_special:
if (my_read(f->specialp, buf, size, offset) == -1) {
res = -errno;
}
break;
default:
res = -EPERM;
}
} else {
res = -EBADF;
}
return res;
}
也就是说,特别是pread
分支(我还没写my_read
)。但是,调试显示pread
正确地将缓冲区设置为文件内容...经过一些挖掘,我发现错误是在我初始化变量时:即int res = 0;
似乎导致了这个问题行为。如果我将其更改回int res;
,它会再次开始工作。
更奇怪的是:当我将变量保留为未初始化并在最后return
之前将其打印到stderr时 - 即,在完成所有工作之后 - {{1} }失败,我收到pread
错误。
有人能解释一下这里发生了什么吗?我已经在其他地方根据我的要求初始化了我的变量,现在我担心我已经引入了大量等待被发现的定时炸弹!
答案 0 :(得分:0)
read
实现应该返回读取字节数,而不是通常的FUSE接口为0表示成功,而-errno
表示失败。
以下修复了问题,同时保留了初始化:
...
if ((res = pread(f->filep, buf, size, offset)) == -1) {
...
(同样适用于我尚未实施的my_read
分支。)