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

Linux可用磁盘空间显示负数?statvfs调用异常求助

解决statvfs返回负数磁盘空间的问题

嘿,我来帮你搞定这个困扰!你遇到的负数结果,本质是有符号整数溢出导致的,咱们一步步拆解清楚:

问题根源

struct statvfs里的f_frsize(文件系统块大小)和f_bavail(可用块数)都是unsigned long类型。而你用%ld(对应long类型)来打印它们的乘积,当剩余空间的字节数超过long的最大值时,就会溢出变成负数。

比如你的df -h显示/home还有14G左右的剩余空间,换算成字节是14 * 1024^3 ≈ 1.5×10^10,而32位系统下long的最大值只有2^31-1 ≈ 2×10^9,显然远小于实际剩余空间,溢出后自然就变成了负数。

修复方案

你需要用64位无符号整数来计算和打印结果,修改代码如下:

#include <sys/statvfs.h>
#include <stdio.h>
#include <errno.h>

int GET_DISK_SPACE() {
    struct statvfs sbuf;
    // 先检查statvfs调用是否成功,避免异常情况
    if (statvfs("/home/odroid", &sbuf) != 0) {
        perror("statvfs failed to get disk info");
        return -1;
    }
    // 用unsigned long long类型计算,彻底避免溢出问题
    unsigned long long free_bytes = (unsigned long long)sbuf.f_frsize * sbuf.f_bavail;
    printf("Bytes left: %llu\n", free_bytes);
    // 额外:转成人类易读的GB格式,方便查看
    printf("Free space: %.2f GB\n", (double)free_bytes / (1024*1024*1024));
    return 0;
}

额外提示

  • 一定要加上statvfs的错误检查,避免因为路径不存在、权限不足等问题导致的未定义行为。
  • 即使你的系统是64位(long可能是8字节),用unsigned long long依然是更稳妥的跨平台写法。

内容的提问来源于stack exchange,提问作者user6552697

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:03:11