Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
Функция
main()process()process()Функция
print_mount()struct mnentcat /etc/mtab$ <b>ch08-mounted</b> /* Запуск программы *//dev/hda2 / ext3 rw 0 0none /proc proc rw 0 0usbdevfs /proc/bus/usb usbdevfs rw 0 0/dev/hda5 /d ext3 rw 0 0none /dev/pts devpts rw,gid=5,mode=620 0 0none /dev/shm tmpfs rw 0 0none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0/dev/hda1 /win vfat rw,noexec,nosuid,nodev,uid=2076,gid=10,user=arnold 0 08.3. Получение сведений о файловой системе
Вывод сведений о файловой системе, рассмотренный ранее — это хорошо и замечательно, но это не захватывает. Раз мы знаем, что определенная точка монтирования представляет файловую систему, нам нужны сведения о файловой системе. Это даст нам возможность выводить вещи наподобие сведений, полученных с помощью
dfdf -i$ <b>df</b> /* Показать свободное/используемое пространство */Filesystem 1K-blocks Used Available Use% Mounted on/dev/hda2 6198436 4940316 943248 84% //dev/hda5 61431520 27618536 30692360 48% /dnone 256616 0 256616 0% /dev/shm/dev/hda1 8369532 2784700 5584832 34% /win$ <b>df -i</b> /* Показать свободные/используемые индексы */Filesystem Inodes IUsed IFree IUse% Mounted on/dev/hda2 788704 233216 555488 30% //dev/hda5 7815168 503243 7311925 7% /dnone 64154 1 64153 1% /dev/shm/dev/hda1 0 0 0 - /win8.3.1. Стиль POSIX:
statvfs()fstatvfs()На ранних системах Unix была только одна разновидность файловой системы. Для них было достаточно, если
dfОднако в современном мире такой подход был бы непригодным. POSIX предоставляет расширение XSI для получения доступа к этой информации. Главная функция называется
statvfs()#include <sys/types.h> /* XSI */#include <sys/statvfs.h>int statvfs(const char *path, struct statvfs *buf);int fstatvfs(int fd, struct statvfs *buf);statvfs()fstatvfs()struct statvfsstruct statvfs { unsigned long int f_bsize; /* Размер блока */ unsigned long int f_frsize; /* Размер фрагмента («основной размер блока») */ fsblkcnt_t f_blocks; /* Общее число блоков */ fsblkcnt_t f_bfree; /* Общее число свободных блоков */ fsblkcnt_t f_bavail; /* Число доступных блоков (≤f_bfree) */ fsfilcnt_t f_files; /* Общее число индексов */ fsfilcnt_t f_ffree; /* Общее число свободных индексов */ fsfilcnt_t f_favail; /* Число доступных индексов (≤f_files) */ unsigned long int f_fsid; /* ID файловой системы */ unsigned long int f_flag; /* Флаги: ST_RDONLY и/или ST_NOSUID */ unsigned long int f_namemax; /* Максимальная длина имени файла */};Сведений, которые в ней содержатся, достаточно для написания
dfunsigned long int f_bsizeРазмер блока является предпочтительным размером для осуществления ввода/вывода. Файловая система пытается хранить по крайней мере
f_bsizeunsigned long int f_frsizeНекоторые файловые системы (такие, как BSD Fast Filesystem) проводят различие между блоками и фрагментами блоков. Небольшие файлы, общий размер которых меньше размера блока, находятся в некотором числе фрагментов. Это позволяет избежать пустой потери дискового пространства (за счет допустимой цепы большей сложности кода ядра). Размер фрагмента выбирается во время создания файловой системы.
fsblkcnt_t f_blocksОбщее число блоков (в единицах
f_bsizefsblkcnt_t f_bfreeОбщее число свободных блоков в файловой системе.
fsblkcnt_t f_bavailЧисло блоков, которые действительно могут использоваться. Некоторые файловые системы резервируют часть блоков файловой системы для использования суперпользователем при заполнении файловой системы. Современные системы резервируют около 5 процентов, хотя это число может быть изменено администратором. (См. tune2fs(8) на системе GNU/Linux и tunefs(8) на системах Unix.)