【问题标题】:Statfs return strange valuesStatfs 返回奇怪的值
【发布时间】:2012-01-14 21:36:36
【问题描述】:

我目前正在尝试使用 statfs() 以字节为单位获取磁盘空间以及以字节为单位的已用空间。 我做了一个小函数,但我得到了非常奇怪的值。 (我正在开发一个 ubuntu 32 位系统)

代码如下:

bool
CheckDiskSpace( const CLString &devPath, ulonglong &diskSize, ulonglong &totalFreeBytes )
{
bool retVal = false;
struct statfs fs;
if( ( statfs( devPath.c_str(), &fs ) ) < 0 ) {
    printf( "Failed to stat %s: %s\n", devPath.c_str() ,strerror( errno ) );
    return false;
} else {
    diskSize = fs.f_blocks * fs.f_bsize;
    totalFreeBytes = fs.f_bfree * fs.f_bsize;
    retVal = true;
}
return retVal;
}

int main()
{
  ulonglong diskSize, totalFreeBytes;
  CheckDiskSpace( "/dev/sda5", diskSize, totalFreeBytes );
  printf( "Disk size: %llu Byte\n", diskSize );
  printf( "Free size: %llu Byte\n", totalFreeBytes );
}

我得到:

Disk size: 1798447104 Byte
Free size: 1798443008 Byte

我真的不明白这个结果,因为使用“df”命令我得到:

Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda5            111148848  47454952  58047832  45% /
udev                   1756296         4   1756292   1% /dev
tmpfs                   705324       912    704412   1% /run
none                      5120         0      5120   0% /run/lock
none                   1763300      1460   1761840   1% /run/shm

非常感谢任何帮助!

PS:我有一个 120 GB 的 ssd,我的分区在 Ext4 中。

编辑:ulonglong 是预定义类型:

typedef unsigned long long ulonglong;

【问题讨论】:

  • 如果您甚至不检查它们,为什么会返回真/假?
  • 根据statfs(2)f_bsize 成员是“最佳传输块大小”。是什么让您认为这是与 f_blocks 成员相关的文件系统的数据块大小?
  • 这只是完整代码的一个示例,我正在其他地方检查它们。
  • @Borealid:我尝试使用 statvfs 使用 f_frsize,但我得到了相同的值。

标签: c++ linux unix


【解决方案1】:

您将获得安装在 /dev 上的 tmpfs 的结果,因为 /dev/sda5 位于该文件系统上。如果您想知道您的根文件系统,只需使用/ 或任何不在/dev/run 中的路径。

【讨论】:

  • 这正是我的想法,我已经尝试过了,但结果和上一个一样奇怪:磁盘大小:2147270656 字节空闲大小:795549696 字节。我认为这是错误的,因为它给了我 1.99980163574219 GB 的磁盘空间。
  • 奇怪是什么意思?如果它不是完全相同的值,可能是因为您正在计算字节数,而 df 将其打印在 1KB 块中。尝试除以 1024。
  • 在此期间您是否对代码进行了任何其他修改?因为您问题中的结果与df 打印的值完全相同(正如我已经说过的/dev)除以1024...我认为这不是巧合。
  • 是的,我按照你的建议放了“/”而不是“/dev/sda5”!但这给了我与 df 命令除以 1024 相同的结果 ...
  • 带“/”:磁盘大小:2147270656 字节。那是假的不是吗!!?
【解决方案2】:

我想你想要的是:

CheckDiskSpace( "/dev/sda5", &diskSize, &totalFreeBytes );

因为您的代码不会在 CheckDiskSpace 中更改 diskSize 和 totalFreeBytes

【讨论】:

  • 我知道,那是因为它只是我代码的一部分。在完整的代码中,它们发生了变化。
  • @fazo 它们作为参考传递,它是 C++。
猜你喜欢
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 2013-04-26
  • 2013-02-07
  • 2012-06-21
  • 2013-10-08
相关资源
最近更新 更多