1

名前付きパイプを介して送信される断片化されたメッセージから保護するにはどうすればよいですか。エラーや切断をチェックするwhileループのように単純ですか?それともそれ以上のものがありますか?
(winapi、Cで名前付きパイプを使用)

ありがとう。

4

1 に答える 1

2

メッセージを断片化できるかどうかに影響する2つの要因があります。

  1. メッセージの長さ
  2. 読み取り長

メッセージをアトミックに書き込む必要があります。メッセージ全体に対して1回の書き込みです。

メッセージがパイプバッファサイズよりも長い場合(それほど大きくする必要はありません)、メッセージはビットのシーケンスに断片化されます。最初のものはバッファをいっぱいにし、次のいくつかはバッファサイズになり、最後は残っているものになります。

メッセージもアトミックに読む必要があります。つまり、読み取りは、メッセージ全体を一度に取得するのに十分な大きさである必要があります。単一のリーダープロセス(またはスレッド)がある場合は、たとえば、メッセージの先頭から2バイトの長さを読み取ってから、残りのデータをアトミックに読み取ることができます。(4バイトの長さはやり過ぎです。最大バッファーサイズは、システムによって異なりますが、通常は512〜5120の範囲です。)

パイプに書き込むことができるプロセスが複数ある場合、特大のメッセージが送信されている間、他のプロセスがデータをパイプにインターリーブする可能性があるという事実が複雑になります。

厳密には、これはUnixベースのシステムに適用されます。ただし、私の理解では、WinAPIはこの領域でUnixを密接に反映しています。

于 2009-09-01T20:48:52.967 に答える