0

名前付きパイプからデータを読み書きしています。書き込み側では、定数の 110 バイトを書き込んでいると表示されます。読み取り側では、ほとんどの場合、正しい 110 バイトを読み取っていると表示されますが、220 バイトまたは 330 バイトを読み取っていると表示される場合もあります。これは、私がそれを出力すると、同じ read() 内で同じメッセージが 2 回または 3 回続けて出力されるという事実にあります。読むための以下のコードでは、文字をクリアするために 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);
        }
    }
4

3 に答える 3

6

これ:

memset(bufpipe,'\0',5001);

5000 バイトしかないため、1 バイトずつ上書きされます。

しかし、主な「問題」は、read(..., 5000)常に最大 5000 バイトまで読み取れることです。ライターが一度に書き込んだ分だけ読み取ると想定しているようですが、これは正しくありません。ライターが 2 つの読み取りの間に 110 バイトの 2 つのパケットを書き込む場合、リーダーが 220 バイトを読み取ることはまったく正しいことです。

一度に 1 つのパケットのみを読み取る必要がある場合は、パケットを自己記述型にする必要があります。たとえば、最初の 4 バイトには、後続のバイト数が含まれます。次に、4 バイトを読み取り、それを整数に変換してから、そのデータ バイト数を読み取ることで、1 つのパケットを読み取ることができます。

于 2009-05-16T20:38:44.223 に答える
1

readaが a の直後に実行されるというあなたの仮定は真実でwriteはありません。書き込みプロセスは、読み取りが発生する前にパイプに数回書き込む場合があります。書き込まれたデータはバッファの最後に追加されます。別の言い方をすれば、読み取りと書き込みはパケット指向ではありません。それらはストリーム指向です。これはwrite、バッファにデータを追加するだけで、read利用可能なものをすべて取得することを意味します。

于 2009-05-16T20:38:17.067 に答える
0

どのようにライターと同期していますか? 期待どおりに読み取る必要があります(read()に110を指定)

于 2009-05-16T20:40:41.520 に答える