<<
>>

Вызовы файловой системы в Linux

Многие системные вызовы имеют отношение к файлам и файловой системе. Сначала мы рассмотрим системные вызовы, работающие с отдельными файлами. Затем изучим те системные вызовы, которые оперируют каталогами или всей файловой системой в целом.
Для создания нового файла можно использовать системный вызов етеМ. (Когда Кена Томпсона однажды спросили, что бы он поменял, если бы у него была возможность во второй раз разработать операционную систему UNIX, он ответил, что на

этот раз вместо creat он назвал бы этот системный вызов create.) В качестве параметров этому системному вызову следует задать имя файла и режим защиты. Так, команда

fd = creat("abc", mode);

создает файл abc с режимом защиты, указанным в mode. Биты mode определяют круг пользователей, которые могут получить доступ к файлу, а также уровень предоставляемого им доступа. Вопросы защиты файлов и доступа к ним будут рассмотрены в дальнейшем.

Системный вызов creat не только создает новый файл, но и открывает его для записи.

Чтобы последующие системные вызовы могли получить доступ к файлу, успешный системный вызов creat возвращает небольшое неотрицательное целое число, называемое дескриптором файла (file descriptor) (fd в приведенном ранее примере). Если системный вызов выполняется с уже существующим файлом, то длина этого файла уменьшается до 0, а все его содержимое теряется. Файлы можно создавать также при помощи вызова open с соответствующими аргументами.

Теперь продолжим изучение основных вызовов файловых систем, перечисленных в табл. 10.9. Чтобы прочитать данные из существующего файла или записать данные в существующий файл, его нужно сначала открыть с помощью open или creat. Этому системному вызову следует указать имя файла, а также режим, в котором он должен быть открыт: для чтения, для записи либо и для того и для другого.

Также можно указать различные дополнительные параметры. Как и creat, системный вызов open возвращает дескриптор файла, который может быть использован для чтения или записи. Затем файл может быть закрыт при помощи вызова close, после чего дескриптор файла можно использовать повторно (для последующего creat или open). Системные вызовы creat и open всегда возвращают наименьший неиспользуемый в данный момент дескриптор файла.

Таблица 10.9. Некоторые системные вызовы для работы с файлами. В случае ошибки возвращаемое значение s равно -1, fd — дескриптор файла, position — смещение в файле. Параметры должны быть понятны без пояснений

Когда программа начинает выполнение стандартным образом, файловые дескрипторы 0, 1 и 2 уже открыты для стандартного ввода, стандартного вывода и стандартного потока сообщений об ошибках соответственно. Таким образом, фильтр (например, програм

ма sort) может просто читать свои входные данные из файла с дескриптором 0, а писать выходные данные в файл с дескриптором 1, не заботясь о том, что это за файлы. Работа этого механизма обеспечивается оболочкой, которая проверяет, чтобы эти дескрипторы соответствовали нужным файлам (прежде чем программа начнет свою работу).

Чаще всего программы используют системные вызовы read и write. У обоих вызовов по три параметра: дескриптор файла (указывающий, с каким из открытых файлов будет производиться операция чтения или записи), адрес буфера (сообщающий, куда положить данные или откуда их взять), а также счетчик (указывающий, сколько байтов следует передать). Вот и все. Очень простая схема. Пример типичного вызова:

n = read(fd, buffer, nbytes)

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

При последовательном чтении (или записи) он указывает на следующий байт, который будет прочитан (или записан). Например, если перед чтением 1024 байтов указатель был установлен на 4096-й байт, то после успешного системного вызова read он будет автоматически перемещен на 5120-й байт. Указатель в файле можно переместить с помощью системного вызова lseek, что позволяет при последующих системных вызовах read (или write) читать данные из файла (или писать их в файл) в произвольной позиции файла и даже за концом файла. Этот системный вызов назван lseek, чтобы не путать его с теперь уже устаревшим, использовавшимся ранее на 16-разрядных компьютерах системным вызовом seek.

У системного вызова lseek три параметра: первый — дескриптор файла, второй — позиция в файле, а третий сообщает, относительно чего эта позиция — начала файла, текущей позиции или конца файла. Возвращаемое системным вызовом lseek значение представляет собой абсолютную позицию в файле после того, как указатель был изменен. Забавно, что системный вызов lseek — это единственный системный вызов из относящихся к файловой системе, который никогда не вызывает перемещения блока головок диска, так как все, что он делает, — это обновление текущей позиции в файле, представляющей собой просто число в памяти.

Для каждого файла операционная система Linux хранит такие сведения, как тип (режим) файла (обычный, каталог, специальный файл), его размер, время последней модификации, и другую информацию. Программы могут получить эту информацию при помощи системного вызова stat. Первый параметр представляет собой имя файла. Второй является указателем на структуру, в которую следует поместить запрошенную информацию. Поля этой структуры перечислены в табл. 10.10. Системный вызов fstat — это то же самое, что и системный вызов stat, с той лишь разницей, что он работает с уже открытым файлом (имя которого может быть неизвестно), а не с путем.

Таблица 10.10. Поля структуры, возвращаемой системным вызовом stat Устройство, на котором располагается файл Номер i-узла (идентифицирует файл на устройстве)

Режим файла (включая информацию о защите)

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

sort

<< | >>
Источник: Э. ТАНЕНБАУМ Х. БОС. СОВРЕМЕННЫЕ ОПЕРАЦИОННЫЕ СИСТЕМ Ы 4-е ИЗДАНИЕ. 2015

Еще по теме Вызовы файловой системы в Linux:

  1. ВЫЗОВ ВРАЧА
  2. СПТ откликается на вызов обстоятельств
  3. Быстрый вызов желаемого
  4. Бросьте себе вызов
  5. Самоубийство как вызов обществу
  6. § 14 Условное соглашение. – Предложение и вызов. – Договор посредством публичного торга или состязания. – Одностороннее обещание.
  7. § 39 Классификация договоров в отдельных видах. – Римская классификация. – Система прусского закона, французского и австрийского кодекса. – Система русского свода. – Система настоящего изложения.
  8. Тема 15 Правова система і система права. Система законодавства та систематизація нормативно-правових актів
  9. § 46 Принятие наследства. – Значение вызова кредиторов и некоторых публикаций. – Отзыв о принятии и действия, служащие признаком принятия.
  10. Есть вызов – есть чудеса.
  11. § 45 Меры к охранению открывшегося наследства. – Опись. – Вызов наследников. – Утверждение в правах наследства. – Срок на явку наследников и вступление явившихся. – Особые правила для торгового сословия.
  12. Глава 4. Система права и система законодательства
  13. §5. Система военных судов в РФ как часть системы судов общей юрисдикции
  14. § 55 Общие понятия о поклаже. – Поклажа свободная и необходи- мая, по русскому закону. – Кто может вступать в договор о поклаже. – Доказательство поклажи. – Сохранная расписка. – Когда не требуется письменное доказательство. – Обязанности приемщика. – Поклажа в запертом помещении. – Растрата. – Ответственность приемщика. – Возвращение поклажи при несостоятельности. – Вызов наследников приемщика и отдатчика. – Поклажа в гостиницах.
  15. Единство и взаимосвязь правовой системы и системы правового общества
  16. § 1.3. Система трудового права і система трудового законодавства