这是一个有点奇怪的问题。我正在使用 go-fuse 编写 fuse 模块库,目前我有一个大小为 6000 字节的“假”文件,它将为所有读取请求输出一些不相关的数据。我的阅读功能如下所示:
func (f *MyFile) Read(buf []byte, off int64) (fuse.ReadResult, fuse.Status) {
log.Printf("Reading into buffer of len %d from %d\n",len(buf),off)
FillBuffer(buf, uint64(off), f.secret)
return fuse.ReadResultData(buf), fuse.OK
}
如您所见,我正在输出包含读取请求范围的每次读取的日志。奇怪的是,当我 cat
文件时,我得到以下内容:
2013/09/13 21:09:03 Reading into buffer of len 4096 from 0
2013/09/13 21:09:03 Reading into buffer of len 8192 from 0
所以 cat
显然是在读取前 4096 个字节的数据,将其丢弃,然后读取 8192 个字节,其中包含所有数据,因此成功。我也尝试过其他程序,包括 hexdump
和 vim
,它们都做同样的事情。有趣的是,如果我执行 head -c 3000 dir/fakefile
它仍然会进行两次读取,即使后面一次完全没有必要。有没有人对为什么会发生这种情况有任何见解?
最佳答案
我建议您跟踪您的 cat 进程以亲自查看。在我的系统上,cat 读取 64K block ,并执行最后一次 read() 以确保它读取整个文件。最后一个 read() 是区分读取“ block 大小的文件”和更大的文件所必需的。即它确保没有任何内容可读,因为文件大小可能在 fstat() 和 read() 系统调用之间发生了变化。
stat/fstat() 系统调用是否将您的“假文件”大小正确返回给 FUSE?
关于Linux 读取操作请求重复字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18797420/