Linux管道中如何获取可用数据量?fstat返回st_size为0的疑问
能否获取Linux管道中当前可用的数据量?
在Linux系统里,当我们向管道写入数据但还没读取时,不管对管道的读端还是写端调用fstat()函数,返回的st_size字段值都是0。那有没有办法获取管道里当前实际存在的可用数据量?
原问题测试代码
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <sys/stat.h> #define BUFLEN 8 int main() { char buf[BUFLEN]; int fd[2]; struct stat sb; pipe(fd); write(fd[1], buf, BUFLEN); fstat(fd[1], &sb); // 对fd[0]调用结果一致 printf("pipe size=%ld\n", sb.st_size); // 输出0 exit(0); }
答案:可以,但不能用fstat()
fstat()的st_size字段对管道这类特殊文件不适用,返回0是预期行为——因为管道是字节流设备,内核不会通过st_size暴露已缓冲的数据量。要获取当前可用数据量,正确的方法是使用ioctl()的FIONREAD命令。
实现示例
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <sys/ioctl.h> #define BUFLEN 8 int main() { char buf[BUFLEN]; int fd[2]; int available_bytes; pipe(fd); // 向管道写入8字节数据 write(fd[1], buf, BUFLEN); // 通过FIONREAD获取读端可用数据量 if (ioctl(fd[0], FIONREAD, &available_bytes) == -1) { perror("ioctl failed"); exit(EXIT_FAILURE); } printf("当前管道可用数据量:%d字节\n", available_bytes); // 输出8 exit(0); }
注意事项
FIONREAD只能对管道的读端文件描述符调用,对写端调用会返回错误或无效结果。- 这个接口是BSD衍生的,虽不属于POSIX标准,但Linux和绝大多数类UNIX系统都支持。
- 如果想获取管道的总容量上限,可以用
fcntl(fd[1], F_GETPIPE_SZ),但这和当前已存数据量是两个概念。
内容的提问来源于stack exchange,提问作者tahzibi.jafar
相关产品推荐
相关产品推荐

