从未知大小的文件描述符中完全读取

时间:2014-04-12 19:07:39

标签: c pipe

我用过烟斗,我必须从这个烟斗中读取。但问题是:

ssize_t read(int fd, void *buf, size_t count)

我不知道在管道的阅读端存储了多少个字符,因此我无法为计数指定一些数字。我需要将它存储在缓冲区中。

如何存储在此管道中的字符数?

关于

4 个答案:

答案 0 :(得分:2)

只需使用合理大小的缓冲区,尽可能多地阅读。重复一遍。该函数返回读取的字节数。

答案 1 :(得分:2)

  

我不知道在管道的读取端存储了多少个字符

不要担心。在镜头中尝试写入/读取多于PIPE_BUF字节的优点(例如原子性)。实际上,无论如何你可能会得到一堆短读。

#define READ_BUFFER_SIZE PIPE_BUF

unsigned char mybuffer[READ_BUFFER_SIZE];

ssize_t bytesread = 1;

while ((bytesread = read(pipefd, mybuffer, READ_BUFFER_SIZE)) > 0)
{
    concat to bigger buffer, realloc if necessary
}

答案 2 :(得分:1)

您可以简单地请求最大为缓冲区大小的字符数,并在循环中重复执行,例如:

char* buf = malloc(1024);
do {
   bytes_read = read(fd, buf, 1024);
   // store buf somewhere else so you can use it in the next iteration
} while (bytes_read > 0)
free(buf);

答案 3 :(得分:1)

您不需要事先知道有多少字节,并将其作为计数值传递。 您可以定义可以预期的最大数据大小的缓冲区,并从fd读取直到数据存在。

char buf[MAX_DATA_SIZE] = {0};

bytes_read = 0;
while(n > 0)
{
    n = read(fd,buf+bytes_read,MAX_DATA_SIZE)
    bytes_read = bytes_read + n;
}