0

単純化された形式で実際のハンドラーに渡される前に、何らかの処理が必要な複雑なメッセージの着信ストリームがある場合があります。

FIFO ファイル記述子を使用したいと思います。一方のスレッドが一方の端からそれを満たし、もう一方のスレッドがもう一方の端から読み取っています。今、私が望んでいる種類の動作: 読み取りスレッドは で待機しておりselect()、ウェイクアップ時に への呼び出しで読み取ることができる完全なパッケージがあることを保証しread()たい、つまり、再アセンブルする必要がないようにしたいバッファー サイズによる断片化のためのパッケージ (パッケージは、カーネルからユーザー空間へのバッファー通過制限を下回ることが保証されています)。

ファイル記述子の準備ができたとき、つまり、プロデューサーが完全なパッケージを正常に書き込んだときを手動で定義できるように、FIFO を構成する方法があるかどうかを知りたいです。読み取りの準備ができている読み取り終了 (ファイル記述子を介して)。これを実現する方法ioctl()はありますか、または (Linux の世界で) この動作を提供する FIFO 以外に何らかの抽象化がありますか? (変数と条件変数については知っていpthreadますが、プロデューサーとコンシューマーの間の結合を共有ファイル記述子に制限したいと思います。)

4

2 に答える 2

2

pipe() / mknod(S_IFIFO)の代わりにsocketpair()を試してください。

ソケットペアはAF_UNIX、タイプSOCK_STREAM(ストリームベース、使用法はフレーミング/再アセンブリが必要)、SOCK_DGRAM(データグラムベース、フラグメント化またはマージされない)、またはSOCK_SEQPACKET(レコードベース、フラグメント化される可能性があるがマージされない)のドメインで作成できます。 。

于 2011-01-19T19:12:57.147 に答える
1

ファイル記述子の準備ができたときに手動で定義できるように FIFO を構成する方法があるかどうかを知りたい

そのような方法はありません。

必ず。

  • ある種のメッセージ フレーミングを定義します。たとえば、メッセージの長さをメッセージの先頭に追加するか、改行で区切ります (メッセージ内で改行を使用できない場合)。改行で区切られたメッセージの場合、複数のストリームを多重化するかタイムアウトを提供するために select() に依存していない限り、ファイル記述子を FILE* にラップし、そこから fgets() をラップできる場合があります。
  • read()1 つのメッセージ、1 つ未満のメッセージ、または 1 つを超えるメッセージを処理または同様に読み取る準備をしてください。FIFO は単なるバイト ストリームであるため、そのレイヤーにはメッセージ境界がありません。
  • 読んだメッセージをどのように分離するかに従って解析します。

もう 1 つの方法は、常に固定長のメッセージを送信することです。これにより、メッセージの妥当な最大サイズを定義できる限り、1 つのメッセージを取得するためにどれだけ読み取るかを常に知ることができます。または、AF_UNIX データグラム ソケットを使用することもできます。

于 2011-01-19T19:09:02.780 に答える