2011-01-19 8 views
0

複雑なメッセージが入ってくるストリームがあり、実際のハンドラに単純な形式で渡される前に処理が必要な場合があります。ファイルディスクリプタの準備を制御する

私はFIFOファイルディスクリプタを使用したいと思います。一方のスレッドは片方のスレッドをもう一方のスレッドは他方のスレッドから読み込みます。今では私が持っているような行動があります:読書スレッドはselect()で待っています。私は起床時に、read()への呼び出しで読むことができる完全なパッケージがあることを保証したいと思います。バッファーサイズによる断片化のためにパッケージを再アセンブルする(パッケージはカーネルからユーザー空間へのバッファーの受け渡し制限を下回ることが保証されている)。

ファイルディスクリプタがいつ用意されているか、つまりプロデューサが完全なパッケージを正常に作成したときに、手動で定義できるようにFIFOを構成する方法があるかどうかを知りたいのですが、 (ファイルディスクリプタを介して)読み込みが完了したことを読み込み側に知らせます。 ioctl()経由でこれを実現する方法はありますか?(Linuxの世界では)この動作を提供するFIFO以外の抽象概念がありますか? (私は約pthreadと条件変数を知っているが、私は、共有ファイル記述子に制限される生産者と消費者との間のカップリングをしたいと思います。)

答えて

1

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

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

する必要があります。

  • 何らかのメッシュフレームを定義します。例えばメッセージの長さをメッセージの前に付加するか、改行で区切ります(メッセージ内で改行ができない場合)。改行で区切られたメッセージの場合、複数のストリームを多重化するためにselect()に依存しないか、タイムアウトを指定しない限り、ファイル記述子をFILE *とfgets()でラップすることができます。
  • read()または同様のread 1メッセージ、1メッセージ未満または1メッセージ以上を処理するように準備されています。つまり、fifoはバイトのストリームなので、そのレイヤーにはメッセージ境界はありません。
  • 読んだメッセージをどのように分離するかによって解釈します。

もう1つの方法は、固定長のメッセージを常に送信し、1メッセージを読むためにどれだけ読むか、おそらくAF_UNIXデータグラムソケットを使用することです。メッセージ。

2

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

ソケットペアがタイプSOCK_STREAMとドメインAF_UNIXで行うことができます(ストリームベース、あなたの使用量は、フレーミング/再構築が必要になります)、SOCK_DGRAM(データグラムベース、断片化またはマージされません)、またはSOCK_SEQPACKET(レコードベースフラグメント化されていても統合されていない可能性があります)。

関連する問題