Свободное (свободное) дисковое пространство в Linux показывает отрицательное значение? - PullRequest
0 голосов
/ 22 мая 2018
#include <sys/statvfs.h>

int GET_DISK_SPACE()
{
  struct statvfs sbuf;
  statvfs("/home/odroid", &sbuf);
  printf("Bytes left:%ld\n", sbuf.f_frsize*sbuf.f_bavail);

}

Написал эту простую функцию, чтобы освободить место на диске на моей машине с Linux, и она возвращает отрицательное значение.оригинал: -89366528

Затем я добавил простой текстовый файл с размером: 877 bytes | Size on disk: 4.00 KB

и значение изменилось на -89370624

Затем продублировал файл и получил-89374720 Эти цифры не имеют никакого смысла.Не уверен, что я делаю не так.Когда я запускаю df -h, это то, что я получаю

enter image description here

1 Ответ

0 голосов
/ 22 мая 2018

Чтобы убедиться, что у вас нет арифметического переполнения и нет несоответствия строки формата, используйте long long явно:

unsigned long long num_bytes = sbuf.f_bsize;
num_bytes *= sbuf.f_bavail;
printf("Bytes available: %llu\n", num_bytes);

Пока тип вашего выражения зависит отТипы членов структуры, которые являются typedefs, будет невозможно выбрать правильную строку формата.Поскольку printf - это varargs, компилятор не будет автоматически преобразовываться в правильный тип.Введение вспомогательной переменной позволяет вам быть абсолютно уверенным в ширине параметра, передаваемого в printf.

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

...