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);
}
вот результат, который я получаю:
- сфотографировать состояние 2
- Доступная память 6868992
- Поворот: 325 рабочих = 1 вверх = 1
- сохранение изображения в Pix/005/img014_2020-07-02_10-23-37.jpg
- Изображение сохранено, сфотографируйте состояние 2
- Доступная память 2777088
- Поворот: 352 рабочих = 1 вверх = 1
- сохранение изображения в Pix/005/img015_2020-07-02_10-23-46.jpg
- Изображение сохранено, сфотографируйте состояние 2
- Доступная память 4293648384
- Поворот: 379 рабочих = 1 вверх = 1
- сохранение изображения в Pix/005/img016_2020-07-02_10-23-55.jpg
- Изображение сохранено, сфотографируйте состояние 2
- Доступная память 4289556480
- Поворот: 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 .
Обратите внимание, что писать в памяти о разделе на диске не очень понятно, и его можно спутать с ОЗУ.