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()、失敗してに設定さerrnoれますEWOULDBLOCK

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

マニュアルページから:

O_NONBLOCK: 2 つの新しいオープン ファイル記述に 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 に答える