名前付きパイプを介して送信される断片化されたメッセージから保護するにはどうすればよいですか。エラーや切断をチェックするwhileループのように単純ですか?それともそれ以上のものがありますか?
(winapi、Cで名前付きパイプを使用)
ありがとう。
名前付きパイプを介して送信される断片化されたメッセージから保護するにはどうすればよいですか。エラーや切断をチェックするwhileループのように単純ですか?それともそれ以上のものがありますか?
(winapi、Cで名前付きパイプを使用)
ありがとう。
メッセージを断片化できるかどうかに影響する2つの要因があります。
メッセージをアトミックに書き込む必要があります。メッセージ全体に対して1回の書き込みです。
メッセージがパイプバッファサイズよりも長い場合(それほど大きくする必要はありません)、メッセージはビットのシーケンスに断片化されます。最初のものはバッファをいっぱいにし、次のいくつかはバッファサイズになり、最後は残っているものになります。
メッセージもアトミックに読む必要があります。つまり、読み取りは、メッセージ全体を一度に取得するのに十分な大きさである必要があります。単一のリーダープロセス(またはスレッド)がある場合は、たとえば、メッセージの先頭から2バイトの長さを読み取ってから、残りのデータをアトミックに読み取ることができます。(4バイトの長さはやり過ぎです。最大バッファーサイズは、システムによって異なりますが、通常は512〜5120の範囲です。)
パイプに書き込むことができるプロセスが複数ある場合、特大のメッセージが送信されている間、他のプロセスがデータをパイプにインターリーブする可能性があるという事実が複雑になります。
厳密には、これはUnixベースのシステムに適用されます。ただし、私の理解では、WinAPIはこの領域でUnixを密接に反映しています。