これは少し奇妙な質問です。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 バイトを読み取ります。これにはすべてのデータが含まれるため、成功します。hexdump
とを含む他のプログラムでも試しましたがvim
、それらはすべて同じことを行います。興味深いことに、a を実行するhead -c 3000 dir/fakefile
と、後者の読み取りは完全に不要ですが、2 つの読み取りが実行されます。なぜこれが起こっているのかについての洞察を持っている人はいますか?