0

私は FUSE オーバーレイ fs (notifyfs) を作成しています。これは、データベース クライアントがクエリを通じてデータを取得できるようにすることができます。私の意図は、エントリとそのプロパティ (属性だけでなく、MIME タイプ、アイコンなど) を表示するときに、キャッシュ/overlayfs/データベース クライアントがデータを取得できるようにすることです。

クエリは、ディレクトリの内容を取得することです。すでに notifyfs への接続 (=fd) を持っているクライアントは、「list_message」を介してデータを要求します。私の質問は、notifyfs が提供しなければならない応答をどのようにプログラミングするかです。私は3つまたは2つの異なる方法について考えています。次の点に注意してください。

異なるエントリを持つ基本形式の notifyfs 応答。ここで、すべてのエントリは次のようなものです。

int mode
uid_t uid
gid_t gid
size_t size
timespec ctime
timespec mtime
timespec atime
int lenname
char name[]

(これを notifyfs_entry_struct と呼びます)

名前の長さは固定されておらず、最大 255 であることに注意してください。さらにクライアントは、最大で特定の数のエントリを要求します。この最大値について正確にはわかりませんが、80 程度になるでしょう。

a. 1 つの大きなバッファー。サイズは次のようなものです。

80 x (255+sizeof(struct notifyfs_entry_struct))

確かに20400バイト以上になります。

b. iovec や readdir などを使用した固定サイズのチャンク。

最良の選択肢は何ですか?最初の方法は、少なくとも 20400 バイトになるバッファーを使用します。これは大量ですが、それでも実行可能ですか?

ステフ

4

1 に答える 1

0

「接続」について言及したので、TCPソケットについて話していると思います。

どの方法を選択するかは問題ではありません。a.少し簡単です-連続したメモリ、バッファへの単純なオフセット。

注意しなければならないのは、TCP ソケットがバイトのストリームであることですread(2)メッセージの境界を認識しないため、メッセージは可変サイズであるため、またはの戻り値から完全なメッセージを取得したかどうかはわかりませんrecv(2)。部分的なメッセージの読み取りを処理し、未処理のバイトをバッファリングする必要があります。

于 2012-11-05T17:33:52.907 に答える