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: 2 つの新しいオープン ファイル記述に 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";
}