Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Перенаправление ввода/вывода



Механизм перенаправления ввода/вывода является одним из наиболее элегант­ных, мощных и одновременно простых механизмов ОС UNIX. Цель, которая ставилась при разработке этого механизма, состоит в следующем. Поскольку UNIX – это интерактивная система, которая создавалась в конце 60-х – начале 70-х годов, то обычно программы вводили текстовые строки с терминала и выво­дили результирующие текстовые строки на экран терминала. Для того чтобы обеспечить более гибкое использование таких программ, желательно было уметь обеспечить им ввод из файла или из вывода других программ и направить их вы­вод в файл или на ввод другим программам.

Реализация этого механизма основывается на следующих свойствах ОС UNIX. Во-первых, любой ввод/вывод трактуется как ввод из некоторого файла и вывод в некоторый файл. Клавиатура и экран терминала тоже интерпретируются как файлы (первый можно только читать, а во второй можно только писать). Во-вто­рых, доступ к любому файлу производится через его дескриптор (положитель­ное целое число). Фиксируются три значения дескрипторов файлов. Файл с дескриптором 1 называется файлом стандартного ввода (stdin), файл с дескрип­тором 2 – файлом стандартного вывода (stdout) и файл с дескриптором 3 – файлом стандартного вывода диагностических сообщений (stderr). В-третьих, программа, запущенная в некотором процессе, «наследует» от породившего про­цесса все дескрипторы открытых файлов.

В головном процессе интерпретатора командного языка файлом стандартного ввода является клавиатура терминала пользователя, а файлами стандартного вывода и вывода диагностических сообщений – экран терминала. Однако при за­пуске любой команды можно сообщить интерпретатору (средствами соответст­вующего командного языка), какой файл или вывод какой программы должен служить файлом стандартного ввода для запускаемой программы и какой файл или ввод какой программы должен служить файлом стандартного вывода или вывода диагностических сообщений для запускаемой программы. Тогда интер­претатор перед выполнением системного вызова ехес открывает указанные фай­лы, подменяя смысл дескрипторов 1, 2 и 3.

То же самое может проделать и любая другая программа, запускающая третью программу в специально созданном процессе. Следовательно, всё, что требуется для нормального функционирования механизма перенаправления ввода/выво­да, – это придерживаться при программировании соглашения об использовании дескрипторов stdin, stdout и stderr. Это не очень трудно, поскольку в наиболее распространенных функциях библиотеки ввода/вывода printf, scanf и error во­обще не требуется указывать дескриптор файла. Функция printf неявно исполь­зует stdout, функция scanf – stdin, а функция error – stderr.

Файловая система

Файл в системе UNIX представляет собой множество символов с произвольным доступом. В файле содержатся произвольные данные, помещенные туда пользо­вателем, и файл не имеет никакой другой структуры, кроме той, какую налагает на него пользователь.

Структура файловой системы

Здесь мы рассмотрим одну из первых реализации файловой системы, поскольку основные её идеи сохраняются до сих пор.

Информация на дисках размещается поблочно, по 512 байт в каждом блоке. Об­ратите внимание, что блок специально взят равным размеру сектора. Диск разбивается на следующие области (рис. 8.1):

¨ неиспользуемый блок;

¨ управляющий блок или суперблок, в котором содержится размер диска и гра­ницы других областей;

¨ i-список, состоящий из описаний файлов, называемых i-узлами;

¨ область для хранения содержимого файлов.

 

 
 

Рис. 8.1. Организация файлов в UNIX на диске

Каждый i-узел содержит:

¨ идентификацию владельца;

¨ идентификацию группы владельца;

¨ биты защиты;

¨ физические адреса на диске или ленте, где находится содержимое файла;

¨ размер файла;

¨ время создания файла;

¨ время последнего использования файла (modification time);

¨ время последнего изменения атрибутов (change time);

¨ число связей-ссылок, указывающих на файл;

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

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

Каждый файл однозначно идентифицируется старшим номером устройства, младшим номером устройства и i-номером (индексом i-узла данного файла в массиве i-узлов). Когда вызывается драйвер устройства, по старшему номеру индексируется массив входных точек в драйверы. По младшему номеру драйвер выбирает одно устройство из группы идентичных физических устройств.

Файл-директория, в котором перечислены имена файлов, позволяет установить соответствие между именами и самими файлами. Директории образуют древовидную структуру. На каждый обычный файл или файл устройства могут иметься ссылки в различных узлах этой структуры. В непривилегированных программах запись в директории не разрешена, но при наличии соответствующих разреше­ний они могут читать их. Дополнительных связей между директориями нет.

Большое число системных директорий система UNIX использует для своих соб­ственных нужд. Одна из них, корневая директория, является базой для всей структуры директорий, и, «отталкиваясь» от неё, можно найти размещение всех файлов. В других системных директориях содержатся программы и команды, предоставляемые пользователям, и файлы устройств.

Имена файлов задаются последовательностью имён директорий, разделенных косой чертой («/») и приводящих к концевому узлу (листу) некоторого дерева. Если имя файла начинается с косой черты, то поиск по дереву начинается в кор­невой директории. Если же имя файла не имеет в начале косой черты, то поиск начинается с текущей директории. Имена файлов, начинающиеся с «../», подра­зумевают начало поиска в директории, родительской по отношению к текущей. Имя файла stuff (персонал) указывает на элемент stuff в текущей директории. Имя файла /work/alex/stuff приводит к поиску директории work в корневой ди­ректории. Затем к поиску директории аlех в директории work и, наконец, к поиску элемента stuff в директории аlех. Сама по себе косая черта / обозначает корне­вую директорию. В приведенном примере нашла отражение типичная иерар­хическая структура файловой системы, например, work может обозначать диск (устанавливаемый при работе пользователя), аlех может быть директорией поль­зователя, a stuff может принадлежать аlех.

Файл, не являющийся директорией, может встречаться в различных директориях, возможно, под разными именами. Это называется связыванием. Элемент в ди­ректории, относящийся к одному файлу, называется связью. В системе UNIX все такие связи имеют равный статус. Файлы не принадлежат директориям. Скорее, файлы существуют независимо от элементов директорий, а связи в директориях указывают действительно на физические файлы. Файл «исчезает», когда удаля­ется последняя связь, указывающая на него. Биты защиты, заданные в связях, могут отличаться от битов в исходном файле. Таким образом, решается пробле­ма избирательного ограничения доступа к файлам.

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

От файловой системы не требуется, чтобы она вся целиком размещалась на том устройстве, где находится корень. Запрос от системы mount (на установку носите­лей и т. п.) позволяет встраивать в иерархию файлов файлы на сменных томах. Команда mount имеет несколько опций, но обязательных аргументов у стандартного варианта её использования два: имя файла блочного устройства и имя ката­лога. В результате выполнения этой команды файловая система, расположенная на указанном устройстве, подключается к системе таким образом, что ее содер­жимое заменяет собой содержимое заданного в команде каталога. Поэтому для монтирования соответствующего тома обычно используют пустой каталог. Ко­манда umount выполняет обратную операцию – «отсоединяет» (размонтирует) файловую систему, после чего диск с данными можно физически извлечь из сис­темы. Например, для записи данных на дискету необходимо её смонтировать, а после работы – размонтировать.

Защита файлов

Защита файлов осуществляется при помощи номера, идентифицирующего поль­зователя, и установки десяти битов защиты – атрибутов доступа. Права доступа подразделяются на три типа: чтение (read), запись (write) и выполнение (execute). Эти типы прав доступа могут быть предоставлены трём классам пользователей:

владельцу файла, группе, в которую входит владелец, и всем (прочим) пользова­телям. Девять из этих битов управляют защитой по чтению, записи и исполнению для владельца файла, других членов группы, в которую входит владелец, и всех других пользователей. Файл всегда связан с определенным пользовате­лем – своим владельцем – и с определенной группой, то есть у него есть уже известные нам UID (user ID, идентификатор пользователя) и GID (group ID, идентификатор группы). Изменять права доступа к файлу разрешено только его владельцу. Изменить владельца файла может суперпользователь, группу – су­перпользователь или владелец файла.

Программа, выполняющаяся в системе, всегда запускается от имени какого-то пользователя и какой-то группы (обычно – основной группы этого пользова­теля), но связь процессов с пользователями и группами организована сложнее:

здесь различаются идентификатор для доступа к файловой системе (FSUID – file system access user ID, FSGID – file system access group ID) и эффективный идентификатор (EUID – effective user ID, EGID – effective group ID), а при дос­тупе к файлам учитываются ещё и полномочия (capabilities), присвоенные само­му процессу. При создании файл получает UID, совпадающий с FSUID процесса, который его создаёт, и, как правило, GID, совпадающий с FSGID этого процесса. Атрибуты доступа определяют, что разрешено делать с данным файлом данной категории пользователей. Имеются всего три операции: чтение, запись и выполнение.

При создании файла (или ещё одного имени для уже существующего файла) мо­дифицируется не сам файл, а каталог, в котором появляются новые ссылки на узлы. Удаление файла заключается в удалении ссылки. Таким образом, право на создание или удаление файла – это право на запись в каталог.

Право на выполнение каталога интерпретируется как право на поиск в нём (про­хождение через него). Оно позволяет обратиться к файлу по пути, содержащему данный каталог, даже тогда, когда каталог не разрешено читать и список всех его файлов поэтому недоступен.

Помимо трёх названных основных атрибутов доступа существуют дополнитель­ные, используемые в следующих случаях. Атрибуты SUID и SGID существенны при запуске программы на выполнение: они требуют, чтобы программа выполня­лась не от имени запустившего ее пользователя (группы), а от имени владель­ца (группы) того файла, в котором она находится. Выражаясь формально, если файл программы имеет атрибут SUID (SGID), то FSUID и EUID (FSGID и EGID) соответствующего процесса не наследуются от процесса, запустившего его, а совпадают с UID (GID) файла. Благодаря этому пользователи получают возмож­ность запустить системную программу, которая создает свои рабочие файлы в закрытых для них каталогах.

Кроме того, если процесс создает файл в каталоге, имеющем атрибут SGID, то файл получает GID не по FSGID процесса, а по GID каталога. Это удобно для коллективной работы: все файлы и подкаталоги в каталоге автоматически оказываются принадлежащими одной и той же группе, хотя создавать их могут раз­ные пользователи. Есть еще один атрибут – CVTX, который теперь относится к каталогам. Он показывает, что из каталога, имеющего этот атрибут, ссылку на файл может удалить только владелец файла.

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

¨ «-» – обычный файл;

¨ «d» – каталог (директория);

¨ «с» – символьное устройство;

¨ «b» – блочное устройство;

¨ «р» – именованный канал (named pipe);

¨ «s» – «гнездо» (socket1);

¨ «I» – символическая ссылка.

Далее следуют три последовательности, каждая из трёх символов, соответствую­щие правам пользователя, группы и всех остальных. Наличие права на чтение обозначается буквой «r», на запись – «w», на выполнение – «х», отсутствие ка­кого–либо права – знаком «-» в соответствующей позиции.

Наличие атрибута SUID (SGID) обозначается заглавной буквой «S» в позиции права на выполнение для владельца (группы), если выполнение не разрешено, и прописной буквой «s», если разрешено.

Восьмеричная запись – это шестизначное число, первые два знака которого обозначают тип файла и довольно часто опускаются, третья цифра – атрибуты GUID (4), SGID (2) и SVTX (1), а оставшиеся три – соответственно права владельца, группы и всех остальных. Очевидно, что право на чтение можно предста­вить числом «4», право на запись – числом «2», а право на выполнение кодиру­ется как «1».

Например, стандартный набор прав доступа для каталога /tmp в символьной фор­ме выглядит как drwxrwxrwt, а в восьмеричной – как 041777 (это каталог; чтение, запись и поиск разрешены всем; установлен атрибут SVTX). А набор прав -r-S-xw-, или в числовом виде – 102412, будет означать, что это обычный файл, владельцу разрешается читать его, но не выполнять и не изменять; пользователям из груп­пы файла (за исключением владельца) – выполнять (причём во время работы программа получит права владельца файла), но не читать и не изменять; а всем остальным – изменять, но не читать и не выполнять.

Большинство программ создают файлы с разрешением на чтение и запись для всех пользователей, а каталоги – с разрешением на чтение, запись и поиск для всех пользователей. Этот исходный набор атрибутов логически складывается с «пользовательской маской» – user file-creation mask, сокращенно umask, которая обычно ограничивает доступ. Например, следующие значения для umask u=rwx, g=rwx, o=r-x следует понимать так: у владельца и группы остается полный набор прав, а всем остальным запрещается запись. В восьмеричном виде оно запишется как 002 (первая цифра – ограничения для владельца, вторая – для группы, тре­тья – для остальных, запрещение чтения – 4, записи – 2, выполнения – 1). Вла­делец файла может изменить права доступа к нему командой chmod.


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-05-29; Просмотров: 488; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.019 с.)
Главная | Случайная страница | Обратная связь