Работа со смонтированными файловыми системами: — КиберПедия 

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

Работа со смонтированными файловыми системами:

2021-01-29 68
Работа со смонтированными файловыми системами: 0.00 из 5.00 0 оценок
Заказать работу

 

Любой из файлов, и может быть прочитан программное использованием набора процедур:

 

 

 открывает файл, содержащий элементы точек монтирования. Аргумент является файлом, который должен быть открыт. Аргумент похож на второй аргумент, указывая доступ для чтения, записи или чтения/записи. (Рассмотрите команду, которой приходится добавлять элемент к для каждой файловой системы, которую она монтирует, и, которая должна удалять этот элемент.) Затем возвращаемое значение типа используется с оставшимися процедурами.

 читает файл, возвращая указатель на, которая заполнена соответствующими значениями. Это статическое хранилище переписывается при каждом вызове. Когда больше не осталось элементов, она возвращает. (Это сходно с процедурами для чтения файлов паролей и групп; см раздел 6.3 «Имена пользователей и групп».)

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

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

 является более специализированной функцией. Она просматривает, переданную в качестве первого параметра, в поисках опции, совпадающей со вторым аргументом. Если опция найдена, она возвращает адрес совпадающей подстроки. В противном случае возвращается.

Поля в непосредственно соответствуют полям в файле. Структура выглядит следующим образом:

 

 

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

 

В отличие от большинства программ, которые мы до сих пор видели, эта специфична для Linux. Во многих Unix‑системах есть схожие процедуры, но их идентичность не гарантируется.

По умолчанию, читает, выводя сведения о каждой смонтированной файловой системе. Опция позволяет указать другой файл для чтения, такой, как или даже.

Функция обрабатывает командную строку (строки 23–32) и вызывает для указанного файла. (Эта программа следует нашему стандартному шаблону.)

, в свою очередь, открывает файл (строка 45) и проходит в цикле через каждую возвращённую файловую систему (строки 52–53). После завершения она закрывает файл (строка 55).

Функция выводит информацию из. Вывод во многом напоминает вывод '':

ch08‑mounted

 

 

Получение сведений о файловой системе

 

Вывод сведений о файловой системе, рассмотренный ранее – это хорошо и замечательно, но это не захватывает. Раз мы знаем, что определенная точка монтирования представляет файловую систему, нам нужны сведения о файловой системе. Это даст нам возможность выводить вещи наподобие сведений, полученных с помощью и ''.

df

 

df ‑i

 

 

Стиль POSIX: и

 

На ранних системах Unix была только одна разновидность файловой системы. Для них было достаточно, если считывала суперблок каждой смонтированной файловой системы, извлекала значимые сведения и красиво форматировала их для отображения. (Суперблок обычно был вторым блоком в файловой системе; первым был загрузочный блок, содержащий загрузочный код).

Однако в современном мире такой подход был бы непригодным. POSIX предоставляет расширение XSI для получения доступа к этой информации. Главная функция называется («vfs» часть происходит от лежащей в основе технологии SunOS, использованной позже в System V Release 4, которая называется виртуальной файловой системой.) Имеется две функции:

 

 использует для любого файла имя пути; она возвращает сведения о файловой системе, содержащей файл. принимает в качестве первою аргумента дескриптор открытого файла, здесь также возвращается информация о файловой системе, содержащей открытый файл, содержит следующие члены:

 

 

Сведений, которые в ней содержатся, достаточно для написания:

 

Размер блока является предпочтительным размером для осуществления ввода/вывода. Файловая система пытается хранить по крайней мере байтов стоящих данных в смежных секторах на диске. (Сектор является наименьшим количеством адресуемых данных на диске. Обычно дисковый сектор равен 512 байтам.)

 

Некоторые файловые системы (такие, как BSD Fast Filesystem) проводят различие между блоками и фрагментами блоков. Небольшие файлы, общий размер которых меньше размера блока, находятся в некотором числе фрагментов. Это позволяет избежать пустой потери дискового пространства (за счет допустимой цепы большей сложности кода ядра). Размер фрагмента выбирается во время создания файловой системы.

 

Общее число блоков (в единицах) в файловой системе.

 

Общее число свободных блоков в файловой системе.

 

Число блоков, которые действительно могут использоваться. Некоторые файловые системы резервируют часть блоков файловой системы для использования суперпользователем при заполнении файловой системы. Современные системы резервируют около 5 процентов, хотя это число может быть изменено администратором. (См. tune2fs (8) на системе GNU/Linux и tunefs (8) на системах Unix.)

 

Общее число индексов («порядковых номеров файлов» на языке POSIX) в файловой системе. Это число обычно инициализируется и делается постоянным при создании файловой системы.

 

Общее число свободных узлов.

 

Число индексов, которые действительно могут быть использованы. Некоторая часть индексов резервируются для суперпользователя, точно так же, как для блоков.

 

ID файловой системы. POSIX не определяет, что оно представляет, и это под Linux не используется.

 

Флаги, дающие информацию о файловой системе. POSIX определяет два флага: для файловых систем только для чтения (таких, как CD‑ROM) и, который запрещает использование битов setuid и setgid в исполняемых файлах. Системы GNU/Linux предусматривают дополнительные флаги: они перечислены в табл. 8.2.

 

Таблица 8.2. Значения GLIBC для

 

 Флаг POSIX Значение
    Осуществляет принудительное блокирование (см. раздел 14.2).
    Не обновлять при каждом доступе время доступа
    Запрещает доступ через файлы устройств
    Не обновлять поле времени доступе каталогов
    Запрещает исполнение двоичных файлов
  Файловая система запрещает использование битов setuid и setgid.
  Файловая система только для чтения.
    Любая запись осуществляется синхронно (см. раздел 4.6.3).

 

 

Максимальная длина имени файла. Это относится к каждому отдельному компоненту в имени пути; другими словами, максимальная длина для элемента каталога

Типы и определены в. Они обычно являются, но на современных системах они могут быть даже 64‑разрядными, поскольку диски стали очень большими. Следующая программа,, показывает, как использовать:

 

Строки 1–59 в сущности те же самые, как и для. обрабатывает командную стоку, a просматривает в цикле каждую смонтированную файловую систему. осуществляет действительную работу, выводя для каждой интересующей файловой системы.

 

 

Строки 67–68 пропускают файловые системы, которые не основываются на реальных дисковых устройствах. Это означает, что файловые системы типа или игнорируются. (Правда, эта проверка эвристическая, но она работает: в смонтированные устройства перечислены по полному пути устройства: например,.) Строка 70 вызывает с соответствующей проверкой ошибок, а строки 77‑99 выводят сведения.

Строки 89–96 имеют дело с флагами: отдельные биты информации, которые присутствуют или не присутствуют. Обсуждение того, как биты флагов используются в коде С, см. во врезке. Вот вывод:

ch08‑statvfs

 

Во время написания этого, для GLIBC 2.3.2 и ранее, GNU не использует. Это потому, что код читает и вызывает для каждой смонтированной файловой системы, чтобы найти ту, номер устройства которой совпадает с соответствующим аргументом для файла (или дескриптора файла). Для того, чтобы прочесть опции монтирования, коду нужно найти файловую систему, поэтому он может установить биты. Проблема в том, что на смонтированной удаленной файловой системе, сервер которой недоступен, может висеть неопределенно долго, вызвав также зависание. С тех пор эта проблема в GLIBC была исправлена, но не будет изменяться в течение некоторого времени, так что она сможет продолжать работать на более старых системах.

 

ЗАМЕЧАНИЕ. Хотя POSIX определяет и, не все системы их поддерживают или поддерживают корректно. Многие системы (включая Linux, как вскоре будет описано), имеют свои собственные системные вызовы, предоставляющие сходную информацию. GNU использует библиотечную процедуру для получения сведений о файловой системе; исходный файл для этой процедуры наполнен для большого числа различных систем. Со временем ситуация с переносимостью должна улучшиться.

 

Битовые флаги

Обычной методикой, применимой во многих случаях, является использование набора значений флагов; когда флаг установлен (т.е. true), имеет место некоторый факт или применяется некоторое условие. Значения флагов определены либо через именованные константы, либо через перечисления. В данной главе API (описанный далее) также использует флаги. Для поля структуры есть только два флага:

 

 

Физически каждая именованная константа представляет различные позиции битов в значении. Логически каждое значение представляет отдельный бит информации о состоянии; т.е. некоторый факт или условие, которое является или не является истинным для данного конкретного экземпляра.

Флаги устанавливаются, проверяются и очищаются с помощью побитовых операторов С. Например, устанавливает эти флаги, используя побитовый оператор ИЛИ:

 

файловая система только для чтения

 

файловая система запрещает setuid

 

Побитовый оператор И проверяет, установлен ли флаг, а сочетание побитовых операторов И и дополнения очищает флаг:

 

 

Побитовые операторы отпугивают, если вы не использовали их ранее. Однако, только что показанный код примера представляет обычный стиль С. Тщательно изучите каждую операцию; возможно, нарисуйте себе несколько картин, показывающих работу этих операторов. Однажды разобравшись с ними, вы можете тренировать себя, распознавая эти операторы как высокоуровневые операции для управления значениями флагов вместо их трактовки как низкоуровневых манипуляций с битами.

Причина использования флагов кроется в том, что они обеспечивают значительную экономию пространства данных. Одно поле дает возможность хранить по меньшей мере 32 отдельных бита информации. GLIBC (на момент написания) определяет 11 различных флагов для поля.[82] Если бы вы использовали для каждого флага отдельно поле, это потребовало бы использования 11 байтов вместо четырех, используемых. Если бы у вас было 32 флага, это были бы 32 байта вместо четырёх!

 

 

Стиль Linux: и

 

Системные вызовы и специфичны для Linux. Их определения следующие:

 

Как и в случае с и, две версии работают с именем файла или с дескриптором открытого файла соответственно, struct statfs выглядит следующим образом:

 

 

Поля аналогичны полям в. По крайней мере в GLIBC 2.3.2 функции POSIX и являются оболочками вокруг и соответственно, копируя значения из одной разновидности структуры в другую.

Преимуществом использования или является то, что они системные вызовы. Ядро возвращает информацию непосредственно. Поскольку нет поля с опциями монтирования, нет необходимости просматривать каждую смонтированную файловую систему для нахождения нужной. (Другими словами, для заполнения опций монтирования должна проверить каждую смонтированную файловую систему, чтобы найти содержащую файл, имя которого содержится в или. Функция не нуждается в этом, поскольку она не предоставляет сведений об опциях монтирования.)

Есть два неудобства в использовании этих вызовов. Во‑первых, они специфичны для Linux. Во‑вторых, часть сведений из отсутствует в, наиболее значительными из них являются флаги () и число доступных индексов (). (Поэтому Linux приходится находить опции монтирования из других источников, таких, как, и она «фабрикует» информацию для тех полей, для которых действительные сведения недоступны.)

Одно поле заслуживает особого замечания. Это поле, указывающее тип файловой системы. Значение является магическим числом файловой системы, извлеченной из суперблока. Справочная страница statfs (2) предоставляет список обычно используемых файловых систем и их магические числа, которые мы используем в. (Увы, отдельного файла нет.)

 

 

Чтобы сохранить место, мы опустили, которая не изменилась с представленной ранее другой программы, мы также опустили, которая теперь вызывает вместо.

Строки 13–35 содержат список магических чисел файловых систем из справочной страницы statfs (2). Хотя эти числа можно получить из заголовочных файлов исходного кода ядра, это трудно (мы пробовали), а показанному здесь способу представления следовать легче. Строки 86–125 определяют, которая преобразует магическое число в выводимую строку. Она осуществляет простой линейный поиск в таблице пар (значение, строка). В (маловероятном) случае, когда магическое число в таблице отсутствует, создает сообщение «неизвестный тип» и возвращает его (строки 123–124).

 (строки 129–153) выводит сведения из. Член опущен, поскольку является непрозрачным типом. Код прост; строка 145 использует для вывода типа файловой системы. Как для сходной программы, использующей, эта функция игнорирует файловые системы, которые не расположены на локальных устройствах (строки 133–134). Вот вывод на нашей системе:

ch08‑statfs

 

В заключение, использование или в вашем собственном коде зависит от ваших потребностей. Как описано в предыдущем разделе, GNU не использует под GNU/Linux и в общем имеет тенденцию использовать уникальный для каждой Unix‑системы системный вызов «получения сведений о файловой системе». Хотя это работает, это не очень привлекательно. С другой стороны, иногда у вас нет выбора: например, проблемы GLIBC, о которых мы упоминали выше. В этом случае нет безупречного решения.

 

 


Поделиться с друзьями:

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.033 с.