raspberry Pi использование statvfs() дает ошибочные результаты

Я использую 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

почему доступная память изменяется в середине выполнения, имейте в виду - я не запускал и не останавливал никакую программу во время этого прогона, и я не выделяю большой объем памяти.

РЕДАКТИРОВАТЬ: Моя проблема - кажется, что 32 ГБ слишком долго для беззнаковой длины. поэтому мне нужно было оценить только f_bavail для моей задачи. НОВИЧОК

1 ответ

У вас переполнение, когда вы это делаете 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 .

Обратите внимание, что писать в памяти о разделе на диске не очень понятно, и его можно спутать с ОЗУ.

Другие вопросы по тегам