Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 管道中有多少数据(c+;+;)_C++_Pipe - Fatal编程技术网

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在读取之前,操作系统缓冲数据并不重要。