Программирование >>  Структура ядра и системные вызовы 

1 ... 18 19 20 [ 21 ] 22 23 24 ... 98


FIFO-файл - это специальный файл, предназначенный для организации канала и создания временного буфера, обеспечивающего взаимодействие двух или более процессов посредством записи данных в этот буфер и чтения данных из буфера. В отличие от обычных файлов размер буфера, связанного с FIFO-файлом, установлен равным PIPE BUF. (PIPE BUF и его минимальное значение в POSIX. 1, POSIX PIPE BUF, определены в заголовке <limits.h>.) Процесс может записывать в FIFO-файл больше, чем PIPE BUF байтов данных, но буфер после заполнения может быть заблокирован. В этом случае процесс должен подождать, пока читающий процесс прочитает данные из канала и освободит место, необходимое для завершения операции записи. Наконец, доступ к данным в буфере осуществляется по алгоритму первым пришел - первым вышел , поэтому такой файл и называется FIFO-файлом (FIFO - first in, first out).

Буфер, связанный с FIFO-файлом, создается, когда первый процесс открывает этот файл для чтения или записи. Буфер удаляется, когда вСе процессы, которые связаны с FIFO-файлом, закрывают свои ссылки (например, указатели на потоки) на FIFO-файл. Таким образом, данные, записанные в FIFO-буфер, являются временными; они сохраняются до тех пор, пока есть процесс, установивший прямую связь с FIFO-файлом для выборки данных.

FIFO-файл может быть создан в UNIX командой mkflfo. Приведенная ниже команда создает FIFO-файл с именем /usr/prog/flfo pipe, если он не существует:

mkfifo /usr/prog/fifo pipe

В некоторых ранних версиях ОС UNIX (например, в UNIX System V.3), FIFO-файлы создавались с помощью команды mknod. Указанная ниже UNIX-команда создает ¥\¥0-фшп /usr/prog/flfo pipe, если он не существует:

mknod /usr/prog/fifo pipe p

Для создания FIFO-файлов в UNIX System V.4 можно использовать и команду mknod, и команду mkfifo, тогда как BSD UNIX поддерживает только команду mkfifo.

FIFO-файл может быть удален подобно любому обычному файлу. Так, FIFO-файл может быть удален с помощью команды т.

Кроме упомянутых типов файлов, в BSD UNIX и UNIX System V.4 определяется также так называемая символическая ссылка. Символическая ссылка содержит путевое имя, которое обозначает другой файл в локальной или удаленной файловой системе. В POSIX. 1 символические ссылки еще не поддерживаются, хотя уже предложено добавить этот тип файлов в будущие версии стандарта.

Символическая ссылка может быть создана в UNIX командой In. Следующая команда создает символическую ссылку /usr/mary/slink, которая ссылается на файл /usr/Jose/original. Команда cat обеспечит вывод содержимого файла /usr/Jose/original на экран:

In -s /usr/jose/original /usr/mary/slirik cat -n /usr/mary/slink

Путевое имя, на которое ссылается символическая ссьшка, может быть получено в UNIX с помощью команды Is -/, выполняемой над этим файлом-ссылкой. Следующая команда покажет, что /usr/mary/slink является символической ссылкой на файл /usr/Jose/original:

% Is -1 /usr/mary/slink ,.j ..

Ir-r-r- 1 terry 18 Aug 20, 1994 slink -t* /usr/jose/original

Можно создать символическую ссьшку, указывающую на другую символическую ссылку. Если символические ссылки задаются как аргументы в UNIX-командах vi, cat, more, head, tail и т.д., эти команды будут обрабатывать символические ссылки с целью получить доступ к обычным файлам, которые обозначены такими ссылками. При этом UNIX-команды гт, mv и chmod будут оперировать только аргументами-символическими ссылками, а не файлами, которые они обозначают.

6.2. Файловые системы UNIX и POSIX

Файлы в UNIX- и POSIX-системах хранятся в древовидной иерархической файловой системе. Корень файловой системы - это корневой каталог, обозначенный символом / . Каждый промежуточный узел в дереве файловой системы - это каталог. Конечные вершины дерева файловой системы являются либо пустыми каталогами, либо не каталогами.

Абсолютное путевое имя файла состоит из имен всех каталогов, ведущих к указанному файлу, начиная с корневого каталога. Имена каталогов в путевом имени отделяются друг от друга символами / . Так, путевое имя /usr/xyz/a.out означает, что файл а.ои/расположен в каталоге xyz, который, в свою очередь, находится в каталоге usr, а каталог usr - в каталоге / .

Относительное путевое имя может состоять из символов . и Они являются ссылками соответственно на текущий и родительский каталоги. Например, путевое имя ../../.login обозначает файл с именем .login, который находится в каталоге двумя уровнями выше текущего каталога. Хотя POSIX. 1 не требует, чтобы каталог содержал файлы . и .. , в нем все-таки указано, что относительные путевые имена с символами . и должны интерпретироваться так же, как в ОС UNIX.

Длина имени файла не может превышать NAME MAX символов, а общее число символов путевого имени не должно превышать РАТН МАХ. Установленные в POSIX. 1 минимальные значения NAME MAX и РАТН МАХ - это POSIX NAME MAX и POSIX PATH MAX соответственно (определены в заголовке <limits.h>).

Кроме того, в POSIX.l определен набор символов, который должен поддерживаться всеми POSIX.l-совместимыми операционными системами как допустимый для имен файлов. Прикладные программы, которые



переносятся в системы POSIX. 1 и UNIX, должны манипулировать файлами с именами, состоящими из следующих символов:

0-9 - .

Путевое имя файла называется жесткой ссылкой. Файл может обозначаться несколькими путевыми именами, если пользователь создаст одну или несколько жестких ссылок на него с помощью UNIX-команды In. В частности, следующая UNIX-команда создает новую жесткую ссылку /usr/prog/new/nl для файла /usr/foo/pathl. После выполнения этой команды к файлу можно обращаться по любому из этих путевых имен.

In /usr/foo/pathl /usr/prog/new/nl

Обратите внимание, что если в данной команде указана опция -s, ссылка /usr/prog/nl будет символической, а не жесткой. Различия между жесткими и символическими ссылками будут разъяснены в главе 7.

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

Файл

Что содержит

/etc Системнь[е административньге файлы и программы

/etc/passwd Всю информацию о пользователях

/etc/shadow Пароли пользователей (только для UNIX System V)

/etc/group Всю информацию о группах

/bin Все системные программы, в частности cat, rm, ср и т.д.

/dev Все байт-ориентированные и блок-ориентированные файлы устройств

/usr/include Стандартные файлы заголовков

/usr/lib Стандартные библиотеки

/tmp Временные файлы, создаваемые программами

6.3. Атрибуты файлов в UNIX и POSIX

и в UNIX, и в POSIX. 1 поддерживается набор общих атрибутов для всех файлов, присутствующих в файловой системе. Эти атрибуты описаны ниже.

Атрибут

file type (тип файла)

access permission (права доступа)

hard link count (счетчик жестких ссылок)

Значение

Тип файла

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

Количество жестких ссылок на файл

Атрибут

Значение

UID GID

file size (размер файла)

last access time (время последнего доступа)

last modify time (время последней модификации)

last change time (время последнего изменения)

inode number (номер индексного дескриптора)

file system ID (иденти ф икатор файловой системы)

Идентификатор владельца файла

Идентификатор фуппь[, к которой принадлежит владелец

файла

Размер файла в байтах

Время, когда к файлу последний раз производился доступ Время, когда файл последний раз модифицировался

Время, когда последний раз изменялись права доступа к файлу, его UID, GID и значение счетчика жестких ссылок

Системный номер индексного дескриптора файла

Идентификатор файловой системь[, в которой находится файл

В ОС UNIX большая часть этой информации для любых файлов может бьпъ получена с помощью команды к -I.

Перечисленные атрибуты необходимы ядру для управления файлами. Например, когда пользователь пытается получить доступ к файлу, ядро сравнивает его UID и GID с UID и GID файла, чтобы определить, какая категория (пользователь, группа или прочие) разрешений на доступ должна быть задействована при установлении прав. Кроме того, время последней модификации файла используется в UNIX утилитой make для того, чтобы определить, какие исходные файлы новее, чем построенные на их основе выполняемые файлы, и требуют перекомпиляции.

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

В дополнение к указанным атрибутам в UNIX-системах для каждого файла устройства хранятся старший и младший номера устройства. В POSIX. 1 поддержка файлов устройств зависит от реализации ОС, поэтому старший и младший номера устройства как стандартные атрибуты для них не определяются.

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



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

тип файла;

номер индексного дескриптора файла;

идентифтсатор файловой системы;

старший и младший номера устройства (для файлов устройств только в UNIX).

Остальные атрибуты изменяются следующими UNIX-командами и системными вызовами:

Команда UNIX

Системный вызов

Изменяемый атрибут

chmod

chmod

Право доступа и время последнего изменения

chown

chown

UID и время последней модификации

chgrp

chown

GID и время последней модификации

touch

utime

Время последнего доступа и время модификации

link

Значение счетчика жестких ссылок (увеличивается)

unlink

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

vi, emac

Размер файла, время последнего доступа и последней модификации

6.4. Индексные дескрипторы в UNIX System V

Рассмотрим назначение двух таких атрибутов файла, как номер индексного дескриптора и идентификатор файловой системы. Можно также заметить, что имена файлов не относятся к атрибутам, хранимым операционной системой для каждого файла. Используя в качестве примера UNIX System V, мы попробуем в этом разделе объяснить назначение этих атрибутов.

В UNIX System V для каждой файловой системы создается таблица индексных дескрипторов, в которой хранится информация обо всех файлах. Каждая запись в таблице индексных дескрипторов содержит все атрибуты файла, включая уникальный номер этого дескриптора и физический адрес на диске, где хранятся данные файла. Таким образом, если ядру необходим доступ к информации файла с номером индексного дескриптора, скажем, 15, то оно будет просматривать таблицу индексных дескрипторов и искать запись, содержащую индексный дескриптор с номером 15. Так как номер индексного дескриптора уникален только в пределах одной файловой системы, то запись индексного дескриптора файла определяется по идентификатору

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

Операционная система не включает имя файла в запись индексного дескриптора, потому что установление соответствия между именами файлов и номерами индексных дескрипторов выполняется через каталоги. В частности, каталог содержит список имен и соответствующие им номера индексных дескрипторов для всех находящихся здесь файлов. Например, если каталог/оо содержит файлы xyz, a.outw xyzJnJ, где xyzjnl является жесткой ссьипсой на xyz, то содержимое этого каталога будет выглядеть так, как показано на рис. 6.1 (большинство данных, зависящих от реализации ОС, опущено).

Для того чтобы получить доступ, например, к файлу /usr/Joe, ядро UNIX всегда может воспользоваться номером индексного дескриптора каталога / любого процесса (он сохраняется в U-области процесса и может быть изменен посредством системного вызова chdir). Ядро просматривает файл каталога / (используя запись для индексного дескриптора / ), чтобы найти номер индексного дескриптора файла usr. Узнав номер дескриптора, оно проверяет, имеет ли вызывающий процесс право на поиск в каталоге usr, и получает доступ к содержимому файла usr. Затем ядро ищет номер индексного дескриптора файла joe.

Всякий раз, когда в каталоге создается новый файл, ядро UNIX создает новую запись в таблице индексных дескрипторов для сохранения информации о нем. Кроме того, ядро, присвоив этому файлу уникальный номер индексного дескриптора, добавляет его имя и номер дескриптора в соответствующий каталог. : <- ьгл1.-ъ. .

Номер М-!-.,.-.-;ои:ат>ти

индексного

дескриптора Ия файла

a.out

xyz ln 1

Рис. 6.1. Примерное содержимое файла каталога

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



1 ... 18 19 20 [ 21 ] 22 23 24 ... 98

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика