我正在尝试监控嵌入式 linux 系统 (petalinux) 中可用的 SD 卡大小。

在围绕 stackoverflow 寻找这个主题之后,我了解到一个不错的选择是使用 statvfs 结构。

所以为了测试它,我写了下一个代码:

int main()
{
  struct statvfs stat;

  if (statvfs("/run/media/mmcblk1p2", &stat) != 0) {
    // error happens, just quits here
    return -1;
  }
  printf("bsize: %ld\n", stat.f_bsize);
  printf("bavail: %ld\n", stat.f_blocks);
  printf("size in bytes: %ld\n", stat.f_blocks*stat.f_bavail);
  double megas= (((double)(stat.f_blocks*stat.f_bavail)) / (1024*1024));
  printf("size in MB:%.0f \n", megas);

  return 0;
}

输出是:

bsize: 131072
bavail: 973877
size in bytes: 945460243017
size in MB:901661 

用我得到的 df 命令检查这个:

root@petalinux:~# df
Filesystem           1K-blocks      Used Available Use% Mounted on
devtmpfs                484744         4    484740   0% /dev
tmpfs                  1023712       128   1023584   0% /run
tmpfs                  1023712        88   1023624   0% /var/volatile
/dev/mmcblk1p2       124656256    391168 124265088   0% /run/media/mmcblk1p2
/dev/mmcblk1p1          204607    135889     68719  66% /run/media/mmcblk1p1

root@petalinux:~# df -h
Filesystem                Size      Used Available Use% Mounted on
devtmpfs                473.4M      4.0K    473.4M   0% /dev
tmpfs                   999.7M    128.0K    999.6M   0% /run
tmpfs                   999.7M     88.0K    999.6M   0% /var/volatile
/dev/mmcblk1p2          118.9G    382.0M    118.5G   0% /run/media/mmcblk1p2
/dev/mmcblk1p1          199.8M    132.7M     67.1M  66% /run/media/mmcblk1p1

我希望 mmcblk1p2 文件夹有 124265088 字节的可用空间,但我有 94​​5460243017 字节。

我已经看过类似的问题,但不幸的是他们都没有帮助我解决这个问题。

有谁知道我做错了什么?

编辑

正如所指出的,它可能是一个块乘法问题,我有:

stat.f_blocks*stat.f_bavail

我把它改成:

 stat.f_frsize*stat.f_bavail

但结果还是错误:

bsize: 131072
bavail: 973877
size in bytes: 127247450112
Size in MB:121353

现在它显示 127247450112,它应该是 124265088,有什么想法我做错了什么吗?

提前致谢。

#1楼 票数:1

这个:

printf("size in bytes: %ld\n", stat.f_blocks*stat.f_bavail);

将两个块数相乘,这肯定不是你的意思。

  ask by joe translate from so

未解决问题?本站智能推荐:

2回复

由statvfs()为文件系统计算的已用空间大于fs中所有文件的大小总和

我有一个50MiB的小分区,格式为ext4,只有一个包含一组照片的目录,安装在/ mnt / tmp上。 然后我使用statvfs()来计算分区中使用的字节,并使用lstat()来计算内部每个文件的大小,为此我编写了这个程序: 将分区的挂载点作为参数(/ mnt / tmp)传递,
2回复

statvfs系统调用失败,错误值对于定义的数据类型而言太大

我的服务器上安装了Red Hat Enterprise Linux Server 6.6(2.6.32-504.el6.x86_64),并且具有以下分区层次结构。 我对每个发出一个statvfs调用 / mediax 分区但系统调用失败,错误Value too larg
1回复

在SD卡上写入时,fopen()返回inavlid参数?

如果要将文件插入套件,我正在尝试在SD卡上写入文件。 否则,应将文件写入项目的当前目录。 我可以将文件写入项目目录中,而不会出现任何问题。 但是,当我尝试将其写入插入的SD卡时,它将返回Invalide argument ! 我试图改变: s转换- S IN的文件名。 这导致
2回复

fstat()返回0,文件大小为0,错误号为11

我正在代码中尝试以下操作: 我得到的输出是: 大小为0且错误号为11的原因是什么? 还有其他方法可以获取文件大小吗? 注意:这里Netdev->queue_fd[class_id]是文件描述符。 在不同的调用中,n_bytes的值在{41,1514,66,..}之
6回复

将 statvfs 正确转换为百分比

我有一个非常简单的测试程序,可以打印出以下数字。 即 打印出来: df 打印出根 fs: 但这里是我感到困惑的地方。 25837672+14159676 != 42137846(实际上是 39997348) 因此,如果我要进行 calc 14159676 / 421378
3回复

statvfs()和statfs()系统调用之间的区别?

为什么statfs()和statvfs()调用在它们如此相似时都存在? 在什么情况下我更喜欢一个?
1回复

它是Linux的SD卡驱动程序的错误吗

我在Linux的SD卡驱动程序中发现了一些奇怪的东西。 该驱动器读取功能卡状态mmc_read_ssr文件drivers/mmc/core/sd.c 。 代码如下: 当函数mmc_app_sd_status返回表示错误的值时,该错误将被清除 err = 0; 读取SSR发
1回复

为什么在VMware上运行的虚拟服务器上的ioctl(sd,SIOCETHTOOL,&ifreq)无法返回硬件地址

我在检索在VMware上运行的虚拟服务器上的硬件地址时遇到一些问题。 我曾经使用C函数在独立的linux服务器上获取硬件地址 ioctl(sd, SIOCETHTOOL, &ifreq) 现在,我已经在esxi VMware之上配置了linux服务器。 现在,相同的C函数