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

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

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

Перенаправление ввода-вывода - student2.ru 1 Не путать с потоком выполнения, или тредом (thread).

Перенаправление ввода-вывода - student2.ru Семейство операционных систем UNIX____________________________________ 323

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

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

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

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

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

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

Информация на дисках размещается блоками. В первой версии файловой систе­мы размер блока был равен 512 байт. Во многих современных файловых системах, разработанных для конкретной версии UNIX-клона, размер блока больше. Это позволяет повысить быстродействие файловых операций. Например, в системе FFS (Fast File System — быстродействующая файловая система) размер блока равен 8192 байт.

В рассматриваемой версии файловой системы раздел диска разбивается на следу­ющие области (рис. 10.1):

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

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

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

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

Перенаправление ввода-вывода - student2.ru 324________________ Глава 10. Краткий обзор современных операционных систем

Перенаправление ввода-вывода - student2.ru

Рис. 10.1. Организация файловой системы в ОС UNIX

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

- идентификатор владельца;

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

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

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

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

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

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

Перенаправление ввода-вывода - student2.ru Семейство операционных систем UNIX____________________________________ 325

- время последнего изменения атрибутов (change time) файла;
- число связей-ссылок, указывающих на файл;

- индикатор типа файла (каталог, обычный файл или специальный файл).

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

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

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

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

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

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

Файл, не являющийся каталогом, может встречаться в различных каталогах, воз­можно, под разными именами. Это называется связыванием. Элемент в каталоге,

Перенаправление ввода-вывода - student2.ru 326________________ Глава 10. Краткий обзор современных операционных систем

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

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

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

Монтирование файловых систем позволяет получить единое логическое файло­вое пространство, в то время как реально отдельные каталоги с файлами могут находиться в разных разделах одного жесткого диска и даже на разных жестких дисках. Причем, что очень важно, сами файловые системы для монтируемых раз­делов могут быть разными. Например, при работе в системе Linux мы можем иметь часть разделов с файловой системой EXT2FS, а часть разделов — с файловой сис­темой EXT3FS. Важно, чтобы ядро знало эти файловые системы.

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

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

Перенаправление ввода-вывода - student2.ru Семейство операционных систем UNIX___________________________________ 327

пользователя (UID) и группы (GID). Изменять права доступа к файлу разрешено только его владельцу. Изменить владельца файла может только суперпользова­тель, изменить группу — суперпользователь или владелец файла.

Программа, выполняющаяся в системе, всегда запускается от имени определен­ных пользователя и группы (обычно основной группы этого пользователя), но связь процессов с пользователями и группами организована сложнее. Различают иден­тификаторы доступа к файловой системе для пользователя (File System access User ID, FSUID) и для группы (File System access Group ID, FSGID), а также эффек­тивные идентификаторы пользователя (Effective User ID, EUID) и группы (Ef­fective Group ID, EGID). Кроме того, при доступе к файлам учитываются полно­мочия (capabilities), присвоенные самому процессу.

При создании файл получает идентификатор UID, совпадающий с FSUID про­цесса, который его создает, а также идентификатор GID, совпадающий с FSGID этого процесса.

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

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

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

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

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

Перенаправление ввода-вывода - student2.ru ' Вложенные каталоги часто называют подкаталогами (subdirectory).

Перенаправление ввода-вывода - student2.ru 328________________ Глава 10. Краткий обзор современных операционных систем

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

- - (дефис) — обычный файл;
- d - каталог;

- с - символьное устройство;

- b - блочное устройство;

- р - именованный канал (named pipe);

- s - со кет (socket)1;

- I - символическая ссылка.

Далее следуют три последовательности, каждая из трех символов, соответствую­щие правам пользователя, группы и всех остальных. Наличие права на чтение обозначается символом г, на запись — символом w, на выполнение — символом х, отсутствие какого-либо права — символом - (дефис) в соответствующей пози­ции.

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

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

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

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

Перенаправление ввода-вывода - student2.ru 1 Сокет — это понятие, связанное со стеком протоколов TCP/IP, который является «родным» для UNIX. Его следует понимать как некий адрес или порт, через который связываются удаленные про­граммы.

Перенаправление ввода-вывода - student2.ru Семейство операционных систем UNIX____________________________________ 329

остальных; запрещение чтения — 4, записи — 2, выполнения — 1). Владелец файла может изменить права доступа к нему командой chmod.

Наши рекомендации