0

我试图猜测管道中有多少数据,我不想使用while(read),因为它在 EOF 之前一直阻塞。

有没有办法做到这一点?

我真的想要这样的东西:

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

我再说一遍,我不想使用while (read),因为它一直阻塞到 EOF。

4

2 回答 2

6

来自管道的数据量可能是无限的,就像流一样,没有size管道中的概念。如果你不想让它阻塞,如果没有什么可读的,你应该O_NONBLOCK在调用时设置标志pipe2()

pipe2(pipefd, O_NONBLOCK);

这样,当您调用时,read()如果没有数据,它将失败并设置errnoEWOULDBLOCK

if (read(fd, ...) < 0) {
   if (errno == EWOULDBLOCK) {
      //no data
   }
   //other errors
}

从手册页:

O_NONBLOCK:在两个新打开的文件描述上设置 O_NONBLOCK 文件状态标志。使用此标志可节省对 fcntl(2) 的额外调用以实现相同的结果。

您还可以在阻塞管道上使用select()来超时。

于 2012-11-14T10:56:23.720 回答
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";
}
于 2012-11-14T13:18:07.710 回答