私のプロジェクトにバグがあり、それが大きなパイプであることがわかりました。Windowsの名前付きパイプ最大制限
process1は約80 KBのメッセージを生成し、その標準出力にnamepdpipeを添付しています。
プロセス2が指定されたパイプからメッセージを読み取った後、メッセージが不完全であることがわかりました。
擬似コードは、名前付きパイプに関する何らかの情報グーグル後
char buffer[4096] ;
string msg ;
while(!namedpipe.isEmpty()) {
int length = namedPipe.read(buffer, 4096) ;
msg.append(buffer, length) ;
}
、そのようなもので、私は、名前付きパイプは、65535バイトに制限され見つかりました。
80KBのメッセージは制限を超えます。
しかし、私は読書の前にスリープ(1000)を挿入します。
char buffer[4096] ;
string msg ;
while(!namedpipe.isEmpty()) {
Sleep(1000) ;
int length = namedPipe.read(buffer, 4096) ;
msg.append(buffer, length) ;
}
メッセージはOKです。
私は眠っている瞬間に、システムが指定されたパイプのメモリを要求していると思います。
したがって、namedpipeは65535バイトの使用を保証します。
私が推測した進歩は正しいですか?
OPがパイプバッファーを大きくするか、実際にメッセージサイズについて話しているかどうかはわかりません。 80Kは、CreateNamedPipeのバッファサイズに渡された内容に関係なく、1つのWriteFile呼び出しでパイプを介して送信できます。以前は、Windows XPで64Kを1回書くのに限界がありましたが、それはOPが見つけたものかもしれません。私は "睡眠は文字通り時間の無駄です"という意味で2回upvoteできますことを願っています。 –
@MillieSmith私が引用したドキュメントはかなり明確です。私はファッジファクタの範囲内にない限り、書き込みがバッファサイズを超えてどのように可能であるかはわかりません。 – EJP
ドキュメントは内部バッファの大きさであり、一度に何通りのデータを送ることができるかではありません。アサートを伴うサンプル・サーバー:http://pastebin.com/ciJj8BDX、アサートを伴うサンプル・クライアント:http://pastebin.com/UTjZ2X8f。 WriteFile呼び出しは、すべてのデータが送信されるまで(FlushFileBuffers呼び出しはまだ必要ですが)返されます。オーバーラップIOでも機能し、クライアントからサーバーへの書き込みも機能します。サーバーを起動してから、クライアントを起動します。私は、あまりにも怠惰で、名前付きパイプがクライアントで作成されるのを待つのが適切でした。 –