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
相关产品推荐
相关产品推荐

