0

我正在从命名管道读取/写入数据。在写入方面,它说它正在写入一个恒定的 110 字节。在阅读方面,大部分时间它说它正在读取 110 个字节,这是正确的,但其他时候它说它正在读取 220 个字节或 330 个字节。事实上,当我打印它时,它会在同一个 read() 中连续打印两到三遍相同的消息。在下面的阅读代码中,我是否对 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 个字节。

但主要的“问题”是它read(..., 5000)总是会尽可能多地读取最多 5000 个字节 - 你似乎假设它只会读取作者一次性写入的内容,这是不正确的。如果写入器在两次读取之间写入两个 110 字节的数据包,那么读取器读取 220 字节是完全正确的。

如果您一次只需要读取一个数据包,则必须使数据包具有自描述性。例如,前四个字节包含后面的字节数。然后您可以通过读取四个字节来读取单个数据包,将其转换为整数,然后读取该数量的数据字节。

于 2009-05-16T20:38:44.223 回答
1

您认为 aread将在 a 之后立即执行的假设write是不正确的。在遇到读取之前,写入器进程可能会多次写入管道。写入的数据将被添加到缓冲区的末尾。换句话说,读写不是面向数据包的。它们是面向流的。这意味着write只需将数据添加到缓冲区并read获取可用的任何内容。

于 2009-05-16T20:38:17.067 回答
0

你是如何与作者同步的?您只需阅读您的期望(指定 110 为 read())

于 2009-05-16T20:40:41.520 回答