1

これは少し奇妙な質問です。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 つの読み取りが実行されます。なぜこれが起こっているのかについての洞察を持っている人はいますか?

4

1 に答える 1

2

猫のプロセスを追跡して、自分で確認することをお勧めします。私のシステムでは、cat は 64K のチャンクを読み取り、最後に read() を実行してファイル全体を確実に読み取ります。その最後の read() は、「チャンクサイズのファイル」の読み取りとより大きなファイルの読み取りを区別するために必要です。つまり、ファイル サイズが fstat() と read() システム コールの間で変更された可能性があるため、読み取るものが何も残っていないことを確認します。

「偽のファイル」のサイズは、stat/fstat() システム コールによって FUSE に正しく返されていますか?

于 2013-09-14T04:59:01.103 に答える