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

wha*_*hat 0 c++ unix named-pipes memset unistd.h

我正在从命名管道读取/写入数据.在写作方面,它表示它正在写一个恒定的110字节.在阅读方面,大多数时候它表示它正在读取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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

Ric*_*dle 6

这个:

memset(bufpipe,'\0',5001);
Run Code Online (Sandbox Code Playgroud)

被一个字节覆盖,因为你只有5000个字节.

但主要的"问题"是,它read(..., 5000)总是能够读取多达5000字节的内容 - 你似乎假设它只能读写作者一次写入的内容,这是不正确的.如果编写器在两次读取之间写入两个110字节的数据包,则读取器读取220字节是完全正确的.

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