You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 12:14:58