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)告诉我停止.这看起来有点笨拙而且很慢.
有一个更好的方法吗?
read 可以返回比你要求的更少的字节,并且如果数据可用则必须这样做,但是为了填充缓冲区需要阻塞.
所以通常的事情是使用select检测可读,然后读取你喜欢的缓冲区大小.或者,使用fcntl设置O_NONBLOCK,并检查-1返回值和errno EAGAIN.
它没有受到任何现代标准的祝福,但执行此操作的常见传统 unix 方法是ioctl(fd, FIONREAD, &n);查看此问题的答案: