Linux 读取操作请求重复字节?

标签 linux file-io fuse

这是一个有点奇怪的问题。我正在使用 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 个字节,其中包含所有数据,因此成功。我也尝试过其他程序,包括 hexdumpvim,它们都做同样的事情。有趣的是,如果我执行 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/

相关文章:

java - 文件名过滤器的使用

c - 防止线程写入同一文件

android - 'sizeof(off_t) != 8' 在为 android 编译 libfuse 时

linux vi 编辑器特殊字符被转换成其他字符

python - 保持成对线的内存有效方式(字符串匹配)

java - 如何使用 ftp4j 通过 sftp 连接到 linux

linux - 使用 vmstat 时没有通过管道写入任何内容

c++ - 无法打开存在的二进制文件

java - "JNA: could not detach thread"是什么意思,如何解决?

hadoop - 无法构建 fuse-dfs 来挂载 HDFS