fsfilcnt_t f_files; /* Общее количество индексных дескрипторов */

fsfilcnt_t f_ffree; /* Общее количество свободных индексных дескрипторов */

fsfilcnt_t f_favail; /* Количество индексных дескрипторов,

доступных для непривилегированного

процесса (задается в 'f_ffree' в Linux) */

unsigned long f_fsid; /* Идентификатор файловой системы */

unsigned long f_flag; /* Флаги монтирования */

unsigned long f_namemax; /* Максимальная длина имен файлов

для данной файловой системы */

};

Назначение большинства полей в структуре statvfs ясно из сопровождающих комментариев. Отметим некоторые особенности, касающиеся отдельных полей.

• Типы данных fsblkcnt_t и fsfilcnt_t являются целочисленными и определены стандартом SUSv3.

• Для большинства файловых систем Linux значения f_bsize и f_frsize одинаковы. Однако некоторые файловые системы поддерживают фрагменты блоков, которые могут быть использованы для выделения меньших единиц хранения в конце файла, если не требуется полный блок. Это устраняет потерю пространства, которая возникла бы при выделении полного блока. В подобных файловых системах параметр f_frsize задает размер фрагмента, а f_bsize — размер целого блока. (Представление о фрагментах в файловых системах UNIX впервые появилось в начале 1980-х годов в файловой системе 4.2BSD Fast File System, которая описана в работе [McKusick et al., 1984].)

• Многие «родные» файловые системы UNIX и Linux поддерживают представление о резервировании некоторой части блоков файловой системы для суперпользователя на тот случай, когда файловая система становится заполненной. Суперпользователь по-прежнему может войти в систему и принять меры по устранению данной проблемы. Если в файловой системе есть зарезервированные блоки, то разность значений полей f_bfree и f_bavail в структуре statvfs сообщит нам, сколько блоков зарезервировано.

• Флаг f_flag является битовой маской флагов, используемых для монтирования файловой системы; то есть содержит информацию, подобную аргументу mountflags, передаваемому в системный вызов mount(2). Однако константы, применяемые для битов данного поля, имеют имена, начинающиеся с префикса ST_, а не MS_, который используется в аргументе mountflags. Согласно стандарту SUSv3 необходимы лишь константы ST_RDONLY и ST_NOSUID, однако реализация библиотеки glibc поддерживает полный набор констант с именами, соответствующими константам MS_*, описанным для аргумента mountflags системного вызова mount().

• Поле f_fsid используется в некоторых реализациях UNIX для возврата уникального идентификатора файловой системы — например, значения, которое основано на идентификаторе устройства, содержащего данную файловую систему. В большинстве файловых систем Linux это поле содержит 0.

Стандарт SUSv3 описывает обе функции: statvfs() и fstatvfs(). В Linux (как и в некоторых других реализациях UNIX) эти функции размещены слоем выше над довольно похожими системными вызовами statfs() и fstatfs(). (В некоторых реализациях UNIX системный вызов statfs() есть, а вызов statvfs() отсутствует.) Принципиальные отличия (помимо некоторой разницы в названиях полей) заключаются в следующем.

• Функции statvfs() и fstatvfs() возвращают поле f_flag, которое сообщает информацию о флагах монтирования файловой системы. (В реализации библиотеки glibc эта информация извлекается путем сканирования файла /proc/mounts или /etc/mtab.)

• Системные вызовы statfs() и fstatfs() возвращают поле f_type, которое сообщает тип файловой системы (так, например, значение 0xef53 говорит о том, что файловая система — ext2).

Подкаталог filesys ресурса, содержащего программный код примеров для данной книги, содержит файлы t_statvfs.c и t_statfs.c, демонстрирующие применение функций statvfs() и statfs().

14.12. Резюме

Устройства представлены записями в каталоге /dev. Каждое устройство имеет соответствующий драйвер устройства, который реализует стандартный набор операций, включающий в себя такие, которые соответствуют системным вызовам open(), read(), write() и close(). Устройство может быть реальным, и тогда присутствует соответствующее ему аппаратное устройство, или виртуальным, и тогда аппаратное устройство отсутствует, но, несмотря на это, ядро предоставляет драйвер устройства, который реализует такой же API, какой есть у реального устройства.

Жесткий диск имеет один или несколько разделов, каждый из которых может содержать файловую систему. Файловая система — это упорядоченный набор обычных файлов и каталогов. В Linux реализованы различные файловые системы, в число которых входит традиционная файловая система ext2. По своей концепции эта система напоминает ранние файловые системы UNIX, состоящие из загрузочного блока, суперблока, таблицы индексных дескрипторов и области данных, которая содержит блоки файловых данных. Каждый файл имеет запись в таблице индексных дескрипторов файловой системы. Такая запись содержит разнообразную информацию о файле: его тип, размер, количество ссылок, имя владельца, права доступа, метки времени и указатели на блоки данных этого файла.

Перейти на страницу:

Похожие книги