我想知道管道中有多少数据,我不想使用while(read)
,因为它在EOF之前就会阻塞。
有没有办法做到这一点?
我真的我想要这样的东西:
i = pipe1.size();
pipe1.read(i);
我再说一遍,我不想使用while (read)
,因为它在EOF之前就会阻止。
答案 0 :(得分:6)
来自管道的数据量可能是无限的,就像流一样,管道中没有size
的概念。如果您不希望它阻止,如果没有什么可读,您应该在调用O_NONBLOCK
时设置pipe2()
标志:
pipe2(pipefd, O_NONBLOCK);
这种方式当您致电read()
时,如果没有数据则会失败并将errno
设置为EWOULDBLOCK
if (read(fd, ...) < 0) {
if (errno == EWOULDBLOCK) {
//no data
}
//other errors
}
从手册页:
O_NONBLOCK:在两个新的打开时设置O_NONBLOCK文件状态标志 文件描述。使用此标志可以节省对fcntl(2)的额外调用 达到同样的效果。
您还可以在阻塞管道上使用select()来暂停。
答案 1 :(得分:1)
这可以帮助你,但它是unix特定的:
#include <iostream>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <errno.h>
int pipe_fd; /* your pipe's file descriptor */
......
int nbytes = 0;
//see how much data is waiting in buffer
if ( ioctl(pipe_fd, FIONREAD, &nbytes) < 0 )
{
std::cout << "error occured: " << errno;
}
else
{
std::cout << nbytes << " bytes waiting in buffer";
}