管道中有多少数据(c ++)

时间:2012-11-14 10:53:36

标签: c++ pipe

我想知道管道中有多少数据,我不想使用while(read),因为它在EOF之前就会阻塞。

有没有办法做到这一点?

我真的我想要这样的东西:

i = pipe1.size();
pipe1.read(i);

我再说一遍,我不想使用while (read),因为它在EOF之前就会阻止。

2 个答案:

答案 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";
}