#include <sys/statvfs.h>
int GET_DISK_SPACE()
{
struct statvfs sbuf;
statvfs("/home/odroid", &sbuf);
printf("Bytes left:%ld\n", sbuf.f_frsize*sbuf.f_bavail);
}
编写这个简单的函数来获取linux机器上的磁盘空间,它返回负值。
原件:
-89366528
然后我添加了一个简单的文本文件,大小为:
877 bytes | Size on disk: 4.00 KB
值更改为
-89370624
然后复制文件并得到
-89374720
这些数字毫无意义。不知道我做错了什么。
当我跑的时候这就是我得到的
最佳答案
要确保没有出现算术溢出,并且格式字符串不匹配,请显式使用long long
:
unsigned long long num_bytes = sbuf.f_bsize;
num_bytes *= sbuf.f_bavail;
printf("Bytes available: %llu\n", num_bytes);
只要表达式的类型依赖于结构成员类型(即typedef),就不可能选择正确的格式字符串。由于
printf
是varargs,编译器不会自动转换为正确的类型。引入helper变量可以让您绝对确定传递给printf
的参数的宽度。另外,检查
statvfs
的返回值,以确保这些值实际上意味着什么。如果你犯了错,那就没什么用了。