Linux读操作请求重复字节?

时间:2013-09-14 01:30:13

标签: linux file-io fuse

这是一个奇怪的问题。我正在使用go-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个字节,其中包含所有数据,因此成功。我也尝试过其他程序,包括hexdumpvim,他们都做同样的事情。有趣的是,如果我做head -c 3000 dir/fakefile,它仍会执行两次读取,即使后者完全没有必要。有没有人对为什么会发生这种情况有任何见解?

1 个答案:

答案 0 :(得分:2)

我建议你让你的猫咪过程看看你自己。在我的系统上,cat通过64K块读取,并执行最后的read()以确保它读取整个文件。最后一个read()是区分读取“块大小的文件”和更大的文件所必需的。即它确保没有任何东西可以读取,因为文件大小可能在fstat()和read()系统调用之间发生了变化。

您的“假文件”大小是否通过stat / fstat()系统调用正确返回到FUSE?