unistd.h書き込まれている、より多くのデータを読んでいる)(読み
-
22-08-2019 - |
質問
私は名前付きパイプのオフデータの書き込み/読んでいます。書き込み側では、それが一定の110のバイトを書き込んだことを言います。時間の大部分の読み出し側のそれが正確である110のバイトを読んでいるが、他の時間は、その読み取り220バイトまたは330のバイトと言うことを言います。これは、私はそれをプリントアウトするとき、それは同じ読み取り内の行に2〜3回、同じメッセージをプリントアウトだという事実()で右です。読書のための次のコードでは、私は、charをクリアするためにはmemsetと間違って何かをやっていますか?私は何かがバッファ内に残されていない限り、書かれている、より多くのを読んでいる他の方法を考えることはできません。
int fd1, numread;
char bufpipe[5000];
while(1)
{
fd1 = open("/tmp/testPipe", O_RDONLY);
numread = read(fd1,bufpipe, 5000);//->this should always be 110
if(numread > 1)
{
printf("READ: %i", numread);
bufpipe[numread+1] = '\0';
memset(bufpipe,'\0',5001);
close(fd1);
}
}
解決
この:
memset(bufpipe,'\0',5001);
あなたが唯一の5000バイトを持っているので、は、1バイトで上書きされます。
しかし、主な「問題は」read(..., 5000)
は常に最大5000のバイトまで、できる限りを読むということです - あなたはされていない、それは作家によって一度に書かれたようにのみ限りを読み取ることを想定しているように見えます真。ライターは読み込み2間の110バイトの2つのパケットを書き込んだ場合、それは読者が220のバイトを読み込むことは非常に正しいです。
、あなたのパケットが自己記述ようにする必要があります。だから、例えば、最初の4つのバイトが続くバイト数が含まれています。次に、データ・バイトの数を読み取るその後、整数への変換、4つのバイトを読み取ることにより、単一のパケットを読むことができます。
他のヒント
read
は真実ではありません後write
がすぐに実行されることをあなたの仮定。読み取りに遭遇する前に、ライター・プロセスがパイプに時代のカップルを書くかもしれません。書き込まれたデータは、バッファの末尾に追加されます。パケット指向されていない、言い換える読み取りおよび書き込み。彼らはストリーム指向です。それはwrite
だけのバッファにデータを追加し、read
はちょうどそれが利用可能なものを取得することを意味します。
どのようにして作家に同期されますか? あなたは自分が期待して何を読む必要がある(読むために110を指定します())