C++ 管道中有多少数据(c+;+;)
我试图猜测管道中有多少数据,我不想在(读取)时使用C++ 管道中有多少数据(c+;+;),c++,pipe,C++,Pipe,我试图猜测管道中有多少数据,我不想在(读取)时使用,因为在EOF之前它一直处于阻塞状态 有办法吗 我真的想要这样的东西: i = pipe1.size(); pipe1.read(i); 我再说一遍,我不想在(读取)时使用,,因为它在EOF之前是阻塞的。来自管道的数据量可能是无限的,就像流一样,管道中没有大小的概念。如果您不希望它在无需读取的情况下被阻塞,则在调用pipe2()时应设置O\u NONBLOCK标志: pipe2(pipefd, O_NONBLOCK); 这样,当您调用read
,因为在EOF之前它一直处于阻塞状态
有办法吗
我真的想要这样的东西:
i = pipe1.size();
pipe1.read(i);
我再说一遍,我不想在(读取)时使用
,
,因为它在EOF之前是阻塞的。来自管道的数据量可能是无限的,就像流一样,管道中没有大小的概念。如果您不希望它在无需读取的情况下被阻塞,则在调用pipe2()
时应设置O\u NONBLOCK
标志:
pipe2(pipefd, O_NONBLOCK);
这样,当您调用read()
时,如果没有数据,它将失败并将errno
设置为ewoodblock
if (read(fd, ...) < 0) {
if (errno == EWOULDBLOCK) {
//no data
}
//other errors
}
if(读取(fd,…)<0){
if(errno==ewoldblock){
//没有数据
}
//其他错误
}
从手册页:
O_NONBLOCK:在两个新打开的文件上设置O_NONBLOCK文件状态标志
文件描述。使用此标志可将对fcntl(2)的额外调用保存到
达到同样的效果
您还可以在阻塞管道上使用超时。这可以帮助您,但它是特定于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";
}
#包括
#包括
#包括
#包括
#包括
内部管道_fd;/*管道的文件描述符*/
......
int n字节=0;
//查看缓冲区中有多少数据正在等待
if(ioctl(管道fd、FIONREAD和N字节)<0)
{
std::您可能需要使管道非阻塞,或者使用它来知道何时有数据要读取。不完全是这样。我的管道很长时间都在获取数据,我想在一段时间后读取管道中的数据。我也在使用fork,但不能使用thread。这个主意很好,但在我的情况下,数据以快速顺序进入管道。cat/dev/zero|您的_应用程序
;该管道中有多少数据?不完全正确。我的管道很长时间都在获取数据,我想在用户要求时读取管道中的数据。我也在使用fork,不能使用thread。@HamedJML您可以随时从管道中读取数据。如果管道中没有数据,您将得到EWOULDBLOCK
错误r、 然后可以继续做其他事情。不过,在写入管道时要小心,因为它有一种小的缓冲区,当缓冲区满时,写入程序会阻塞。这个想法很好,但在我的情况下,数据会快速顺序地进入管道。@HamedJML在读取之前,操作系统缓冲数据并不重要。