0

我正在使用raspistill我的 PI 获取图像。几周后,我的 SD 卡已满,整个东西都死了,所以我需要重新安装。所以我添加了一些代码来查看我的可用内存发生了什么。这是评估我的记忆状态的代码。

//https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/com.ibm.zos.v2r2.bpxbd00/rstatv.htm           
        int r = statvfs(".", &buf);
        if (r < 0) {
            printf(" Error in statsvf"); 
            memAvailable = 4; // exit
        }       
        else {
            memAvailable = (unsigned long)(buf.f_bavail * buf.f_bsize);
            printf(" Memory available is %.0lu\n", memAvailable);
        }

这是我得到的结果:

  1. 拍照状态2
  2. 可用内存为6868992
  3. 转:325 工作 = 1 向上 = 1
  4. 将图像保存在 Pix/005/img014_2020-07-02_10-23-37.jpg
  5. 图片保存拍照状态2
  6. 可用内存为2777088
  7. 转:352 工作 = 1 向上 = 1
  8. 将图像保存在 Pix/005/img015_2020-07-02_10-23-46.jpg
  9. 图片保存拍照状态2
  10. 可用内存为4293648384
  11. 转:379 工作 = 1 向上 = 1
  12. 将图像保存在 Pix/005/img016_2020-07-02_10-23-55.jpg
  13. 图片保存拍照状态2
  14. 可用内存为4289556480
  15. 转:406工作= 1向上= 1

为什么在运行过程中可用内存会发生变化 - 我在运行期间没有启动或停止任何程序,也没有分配大容量内存。

编辑:我的错 - 似乎 32GB 对于 unsigned long 来说太长了。所以我只需要为我的任务评估 f_bavail。小白

4

1 回答 1

0

执行此操作时会发生溢出,buf.f_bavail * buf.f_bsize因为计算是使用unsigned long不足以满足分区的可用大小的

使用unsigned long long,例如:

#include <sys/statvfs.h>
#include <stdio.h>

int main()
{
  struct statvfs buf;
  int r = statvfs(".", &buf);
  
  if (r < 0) {
    printf(" Error in statsvf"); 
  }       
  else {
    unsigned long long ull = buf.f_bavail * (unsigned long long) buf.f_bsize;

    printf("Memory available is %llu\n", ull);
  }
  return 0;
}

您还可以使用uint64_t确保在 64b 上有一个无符号整数。

就我而言:

pi@raspberrypi:/tmp $ gcc -Wall c.c
pi@raspberrypi:/tmp $ ./a.out
Memory available is 16778645504
pi@raspberrypi:/tmp $ 

并且结果与命令给出的指示兼容df -H .

注意在磁盘上写入有关分区的内存不是很清楚,可能会与 RAM 混淆

于 2020-07-02T10:44:10.630 回答