1

C++ コードから FIFO バッファを使用したいと考えています。2 つのプロセスがあり、そのうちの 1 つは常に FIFO に書き込み、もう 1 つは常に FIFO を読み取ります。とても簡単です。

バッファの内容を実際に読み取る必要はありません。バッファ内のデータの量を知りたいだけで、それをクリアしたいだけです。

C ++でこれを解決する最も洗練されたソリューションは何ですか?

このコードはうまく機能しますが、バッファの内容は必要ありません。

int num;
char buffer[32];

num = read(FIFO, buffer, sizeof(buffer));
//num is the important variable

ありがとうございました!

4

4 に答える 4

0

私の知る限り、Linux FIFO からバイトをクリアする唯一の方法 (FIFO を破棄する以外) は、それらを読み取ることです。一度に大量のデータを読み取ることで、それらをより速くクリアできます ( 32FIFO に通常書き込まれるサイズでない限り、非常に小さな読み取りサイズです)。ブロッキング モードの場合は、Robert Mason が示したリンクの説明に従って、バイトをクエリする必要があります。記述子が非ブロッキング モードの場合、EAGAINが返されてクリアされたことを知るまで読み取ることができます。を使用pollして、FIFO に追加のデータがいつ到着したかを判断できます。

于 2012-06-25T00:25:11.087 に答える
0

パイプをクリアする唯一の方法はパイプを読み取ることなので、存在するバイト数の問題は議論の余地がありません。パイプを読み取った後にわかります。実際の問題は、他の読み取りと同じになります。

(1)データを気にしない場合は、おそらくそれを待ってブロックしたくないので、FIFOを非ブロックにします。

(2) おそらく、FIFO をポーリングして読み取るものがあるかどうかを確認するために座って時間を無駄にしたくないので、FIFO fd をselectステートメントに入れる必要があります。読むべきものがある場合は、それを排出してカウンターに追加します。

于 2012-06-25T00:55:33.947 に答える
0

この質問を見ることができます: Determing the number of bytes ready to be recv()'d

Linux では、ソケットのコードは FIFO でも最小限の作業で動作するはずです。Windowsですが、よくわかりません。

于 2012-06-24T22:24:44.493 に答える
-1

洗練されているというのが正しいかどうかわかりませんが、最も効率的ですか、それとも最も難読化されているということですか?

とにかく、バッファの内容が必要ない場合は、(共有) インターロック変数を使用できます。

于 2012-06-24T22:05:56.633 に答える