我试图猜测管道中有多少数据,我不想使用while(read)
,因为它在 EOF 之前一直阻塞。
有没有办法做到这一点?
我真的想要这样的东西:
i = pipe1.size();
pipe1.read(i);
我再说一遍,我不想使用while (read)
,因为它一直阻塞到 EOF。
来自管道的数据量可能是无限的,就像流一样,没有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()来超时。
这可以帮助你,但它是特定于 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";
}