【问题标题】:Available(Free) Disk Space in Linux shows negative?Linux中的可用(免费)磁盘空间显示为负数?
【发布时间】:2018-05-21 21:30:58
【问题描述】:
#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 这些数字没有任何意义。不知道我做错了什么。 当我运行df -h 这就是我得到的

【问题讨论】:

  • 应该是%lu 而不是%ld
  • 哦,int GET_DISK_SPACE() 没有 return 任何东西。
  • 这种乘法 sbuf.f_frsize*sbuf.f_bavail 也使得大多数现代系统上的数字非常大。为什么要将大小乘以可用空间?
  • @FredLarson 更改为无符号,我得到 4205584384,即 3GB,但 df -h 显示其中一个目录至少有 24G 可用。我的代码不正确吗?
  • f_frsize*sbuf.f_bavail 没有意义...

标签: c linux diskspace odroid


【解决方案1】:

为确保您没有遇到算术溢出并且没有格式字符串不匹配,请明确使用long long

unsigned long long num_bytes = sbuf.f_bsize;
num_bytes *= sbuf.f_bavail;
printf("Bytes available: %llu\n", num_bytes);

只要表达式的类型依赖于结构成员类型,即 typedef,就不可能选择正确的格式字符串。由于printf 是可变参数,编译器不会自动转换为正确的类型。引入辅助变量可以让您绝对确定传递给printf 的参数的宽度。

另外,检查来自statvfs 的返回值,以确保这些值确实有意义。如果您遇到错误,它们将无济于事。

【讨论】:

  • struct statvfs sbuf; statvfs("/home/odroid", &amp;sbuf); unsigned long long num_bytes = sbuf.f_bsize; num_bytes *= sbuf.f_bavail; printf("Bytes available: %llu\n", num_bytes); 这样做我得到了 23GB,这听起来是正确的。谢谢
猜你喜欢
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 2016-09-06
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 2013-11-11
  • 2019-12-12
相关资源
最近更新 更多