繁体   English   中英

unistd.h read()正在读取更多数据然后被写入

[英]unistd.h read() is reading more data then being written

我正在从命名管道读取/写入数据。 在写方面,它表示正在写一个恒定的110字节。 在大多数情况下,Reading表示读取的是110个字节,而其他时候表示读取的是220个字节或330个字节。 这是正确的,因为当我将其打印出来时,它会在同一read()中连续两次或两次打印出相同的消息。 在下面的阅读代码中,我是否使用memset清除char了吗? 我想不出任何其他方式,除非缓冲区中遗留了一些东西,否则它正在被读取。

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个字节。

但是主要的“问题”是read(..., 5000)始终会读取多达5000个字节的内容-您似乎假设它只能读取与编写者一次写入的内容一样多的内容。 ,这是不正确的。 如果写入器在两次读取之间写入两个110字节的数据包,那么读取器读取220字节是完全正确的。

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

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

您如何与作者同步? 您只需要阅读您的期望(将110指定为read()即可)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM