查找准备从FILE*或文件描述符中读取的字节数

ram*_*ion 9 c pipe file-descriptor

给定一个FILE*或一个文件描述符,是否有一种标准的方法来告诉你有多少字节可以读取?

我不能使用,s=ftell(f),fseek(f,0,SEEK_END),e=ftell(f),fseek(f,s,SEEK_SET),e-s因为FILE*它只包装了我得到的文件描述符pipe(2),ESPIPE当我尝试时,我得到了.

我正在考虑使用select(2)零超时来告诉我至少有一个字节准备好被读取,然后一次读取一个字节,直到select(2)告诉我停止.这看起来有点笨拙而且很慢.

有一个更好的方法吗?

Ste*_*sop 6

read 可以返回比你要求的更少的字节,并且如果数据可用则必须这样做,但是为了填充缓冲区需要阻塞.

所以通常的事情是使用select检测可读,然后读取你喜欢的缓冲区大小.或者,使用fcntl设置O_NONBLOCK,并检查-1返回值和errno EAGAIN.


R..*_*R.. 5

它没有受到任何现代标准的祝福,但执行此操作的常见传统 unix 方法是ioctl(fd, FIONREAD, &n);查看此问题的答案:

无需调用 read() 即可确定管道的大小