我用过烟斗,我必须从这个烟斗中读取。但问题是:
ssize_t read(int fd, void *buf, size_t count)
我不知道在管道的阅读端存储了多少个字符,因此我无法为计数指定一些数字。我需要将它存储在缓冲区中。
如何存储在此管道中的字符数?
关于
答案 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;
}