Я использую statvfs
для очень простой внутренней команды df
.
Помимо того, что я не знаю, как получить путь к устройству файловой системы, моя главная проблема заключается в том, что доступные блоки размером 1 КБ различаются в моей реализации и выводе df
.
Вот мой:
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/x 959863856 21399352 938464504 2 /
df
's:
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 959863856 21399352 889636296 3% /
«Использовано» и «Доступно» указаны в 1K-блоках. Процент может быть из-за округления. Как получить доступное место?
Вот моя реализация:
int main(int argc, char *argv[]) {
struct statvfs stats;
statvfs(argv[1], &stats);
unsigned long n_1k_blocks = stats.f_blocks * stats.f_frsize / 1024;
unsigned long avail = stats.f_bfree * stats.f_frsize / 1024;
unsigned long used = n_1k_blocks - avail;
printf("%-*s\t%*lu\t%*lu\t%*lu\t%*.0f\t%s\n",
spaces, "/dev/x",
spaces, n_1k_blocks,
spaces, used,
spaces, avail,
spaces, 100 - (float)stats.f_bfree * 100.0 / stats.f_blocks,
argv[1] // e.g. " / "
);
return 0;
}
Я называю это как: ./a.out /
для файловой системы, смонтированной в /
Примечание: осмотревшись, я прочитал df source от busybox; coreutils сейчас для меня слишком сложен