Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГОСЫ / operatsionnye_sistemy1.doc
Скачиваний:
39
Добавлен:
15.02.2016
Размер:
479.23 Кб
Скачать

Договоренности о формате командной строки

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

Существует две договоренности по формату ключей. Первая - так называемый UNIX style, или односимвольный формат. Чтобы отличаться от параметра, ключ должен начинаться с символа "-". Второй символ - собственно ключ, он указывает, как именно видоизменяется работа команды. Например, утилита ls показывает список файлов в текущем каталоге. Команда ls имя-каталога воспринимает второй аргумент как параметр и показывает список файлов, находящихся в каталоге имя-каталога. Команды ls -l или ls -l имя-каталога покажут соответствующие списки в "длинном" (long) формате: вдобавок к именам файлов будет выведено немало дополнительной информации. Очень неплохо, если при именовании ключа соблюдается принцип аббревиативности: имя ключа - буква, с которой начинается имя производимого им действия.

Если так случилось, что параметр начинается с символа (например, параметр - отрицательное число), то существует специальный ключ "--" ("-" - это имя ключа, перед которым, по договоренности, должен стоять признак ключа, т. е. еще один "-"), который означает, что все последующие аргументы, как бы они ни выглядели, будут параметрами, а не ключами. Например, утилита cat занимается выводом на стандартное устройство вывода (терминал) всего того, что считала со стандартного устройства ввода. (Если вы запустили cat без параметров, нажмите клавишу Ctrl и одновременно D). В виде "cat имя-файла" cat выводит содержимое файла имя-файла. Поэтому для вывода на терминал содержимого файла -minus-first нужно ввести что-то вроде cat -- -minus-first.

Вторая договоренность по формату ключей носит название GNU style (или полнословный формат), так как зародилась она в недрах сообщества GNU, занимающегося свободным программным обеспечением (см. [14]). Причина появления этой более новой договоренности проста. Если команда имеет слишком широкие возможности, у нее появляется слишком много ключей. Запомнить или хотя бы отыскать в документации однобуквенный ключ (скорее всего, уже не аббревиативный, потому что букв на всех не хватает) непросто. Полнословный ключ начинается с двух минусов и далее содержит одно (или чуть больше) слов-описателей, разделенных также знаком "-". Например, ключ -A (All) предписывает утилите ls вывести имена всех, в том числе "скрытых" файлов (файл, чье имя начинается на . считается скрытым; именно такие имена бывают у файлов и каталогов, создаваемых утилитами UNIX автоматически для своих нужд), кроме ".." и ".", имеющих специальный смысл. В нотации GNU этот ключ выглядит как --almost-all. Гораздо понятнее, но в шесть раз длиннее.

Часто используются так называемые параметрические ключи, т. е. ключи, которым самим требуются параметры. Например, в очень многих утилитах ключ -o означает перенаправление вывода в файл, поэтому следующий за ним параметр должен быть именем этого выходного файла. Скажем, утилита постраничного просмотра файлов less может записывать протокол работы пользователя в файл. Для этого ее надо вызвать с параметрами less что-смотрим -o протокол или, в нотации GNU, less что-смотрим --log-file=протокол. Обратите внимание на символ =, именно так в полнословном формате указывается параметр ключа.

  1. Файловая система. Структура файловой системы. Монтируемые файловые системы. Интерфейс с файловой системой.

Файловая система UNIX характеризуется:

* иерархической структурой,

* согласованной обработкой массивов данных,

* возможностью создания и удаления файлов,

* динамическим расширением файлов,

* защитой информации в файлах,

* трактовкой периферийных устройств (таких как терминалы и ленточные ус-

тройства) как файлов.

Файловая система организована в виде дерева с одной исходной вершиной,

которая называется корнем (записывается: "/"); каждая вершина в древовидной

структуре файловой системы, кроме листьев, является каталогом файлов, а фай-

/

+-------------+------------+---------+---------+---------+

| | | | | |

fsl bin etc usr unix dev

+-+-+ +---+---+ | +-+-+ +-+-+

| | | | | | | | | |

mjb maury sh date who passwd src bin tty00 tty01

|

|

cmd

+---+---+

| |

date.c who.c

лы, соответствующие дочерним вершинам, являются либо каталогами, либо обыч-

ными файлами, либо файлами устройств. Имени файла предшествует указание пути

поиска, который описывает место расположения файла в иерархической структуре

файловой системы. Имя пути поиска состоит из компонент, разделенных между

собой наклонной чертой (/); каждая компонента

представляет собой набор символов, составляющих имя вершины (файла), которое

является уникальным для каталога (предыдущей компоненты), в котором оно со-

держится. Полное имя пути поиска начинается с указания наклонной черты и

идентифицирует файл (вершину), поиск которого ведется от корневой вершины

дерева файловой системы с обходом тех ветвей дерева файлов, которые соответ-

ствуют именам отдельных компонент. Так, пути "/etc/passwd", "/bin/who" и

"/usr/src/cmd/who.c" указывают на файлы, являющиеся вершинами дерева, изоб-

раженного на Рисунке 1.2, а пути "/bin/passwd" и "/usr/ src/date.c" содержат

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

нем следует указывать маршрут относительно текущего для выполняемого процес-

са каталога, при этом предыдущие символы "наклонная черта" в имени пути

опускаются. Так, например, если мы находимся в каталоге "/dev", то путь

"tty01" указывает файл, полное имя пути поиска для которого "/dev

/tty01".

Программы, выполняемые под управлением системы UNIX, не содержат никакой

информации относительно внутреннего формата, в котором ядро хранит файлы

данных, данные в программах представляются как бесформатный поток байтов.

Программы могут интерпретировать поток байтов по своему желанию, при этом

любая интерпретация никак не будет связана с фактическим способом хранения

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

дание метода доступа к данным в файле, устанавливаются системой и являются

едиными для всех программ, однако семантика данных определяется конкретной

программой. Например, программа форматирования текста troff ищет в конце

каждой строки текста символы перехода на новую строку, а программа учета

системных ресурсов acctcom работает с записями фиксированной длины. Обе

программы пользуются одними и теми же системными средствами для осуществле-

ния доступа к данным в файле как к потоку байтов, и внутри себя преобразуют

этот поток по соответствующему формату. Если любая из программ обнаружит,

что формат данных неверен, она принимает соответствующие меры.

Каталоги похожи на обычные файлы в одном отношении; система представляет

информацию в каталоге набором байтов, но эта информация включает в себя име-

на файлов в каталоге в объявленном формате для того, чтобы операционная сис-

тема и программы, такие как ls (выводит список имен и атрибутов файлов),

могли их обнаружить.

Права доступа к файлу регулируются установкой специальных битов разреше-

ния доступа, связанных с файлом. Устанавливая биты разрешения доступа, можно

независимо управлять выдачей разрешений на чтение, запись и выполнение для

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

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

Вновь созданные файлы становятся листьями в древовидной структуре файловой

системы.

Для пользователя система UNIX трактует устройства так, как если бы они

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

становятся вершинами в структуре файловой системы. Обращение программ к уст-

ройствам имеет тот же самый синтаксис, что и обращение к обычным файлам; се-

мантика операций чтения и записи по отношению к устройствам в большой степе-

ни совпадает с семантикой операций чтения и записи обычных файлов. Способ

защиты устройств совпадает со способом защиты обычных файлов: путем соответ-

ствующей установки битов разрешения доступа к ним (файлам). Поскольку имена

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

ройствами и над обычными файлами выполняются одни и те же операции, большин-

ству программ нет необходимости различать внутри себя типы обрабатываемых

файлов.

Физический диск состоит из нескольких логических разделов, на которые он

разбит дисковым драйвером, причем каждому разделу соответствует файл устрой-

ства, имеющий определенное имя. Процессы обращаются к данным раздела, откры-

вая соответствующий файл устройства и затем ведя запись и чтение из этого

"файла", представляя его себе в виде последовательности дисковых блоков.

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

Системная функция mount (монтировать) связывает файловую систему из указан-

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

umount (демонтировать) выключает файловую систему из иерархии. Функция

mount, таким образом, дает пользователям возможность обращаться к данным в

дисковом разделе как к файловой системе, а не как к последовательности дис-

ковых блоков.

Синтаксис вызова функции mount:

mount(special pathname,directory pathname,options);

где special pathname - имя специального файла устройства, соответствующего

дисковому разделу с монтируемой файловой системой, directory pathname - ка-

талог в существующей иерархии, где будет монтироваться файловая система

(другими словами, точка или место монтирования), а options указывает, следу-

ет ли монтировать файловую систему "только для чтения" (при этом не будут

выполняться

+ - - - - - - - - - - - - - - - - - - - - - - - - +

/

| | |

+----------------+--+-------------+ Корневая

| | | | | файловая

bin etc usr система

| | | - |

+-----+-----+ +----+----+ -

| | | | | | - |

cc date sh getty passwd -

+ - - - - - - - - - - - - - - - - - - - - - - - - +

-

+ - - - - - - - - - - - - - - - - - - - - - - - - +

/

| | |

Файловая +----------------+--+-------------+

система из | | | | |

раздела с bin include src

именем | | | | |

/dev/dsk1 +-----+-----+ | |

| | | | | | |

awk banner yacc stdio.h uts

+ - - - - - - - - - - - - - - - - - - - - - - - - +

Рисунок 5.22. Дерево файловых систем до и после выполнения функции mount

такие функции, как write и creat, которые производят запись в файловую сис-

тему). Например, если процесс вызывает функцию mount следующим образом:

mount("/dev/dsk1","/usr",0);

ядро присоединяет файловую систему, находящуюся в дисковом разделе с именем

"/dev/dsk1", к каталогу "/usr" в существующем дереве файловых систем (см.

Рисунок 5.22). Файл "/dev/dsk1" является блочным специальным файлом, т.е. он

носит имя устройства блочного типа, обычно имя раздела на диске. Ядро пред-

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

суперблоком, списком индексов и корневым индексом. После выполнения функции

mount к корню смонтированной файловой системы можно обращаться по имени

"/usr". Процессы могут обращаться к файлам в монтированной файловой системе

и игнорировать тот факт, что система может отсоединяться. Только системная

функция link контролирует файловую систему, так как в версии V не разрешают-

ся связи между файлами, принадлежащими разным файловым системам.

Ядро поддерживает таблицу монтирования с записями о каждой монтированной

файловой системе. В каждой записи таблицы монтирования содержатся:

* номер устройства, идентифицирующий монтированную файловую систему (упо-

мянутый выше логический номер файловой системы);

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

* указатель на корневой индекс монтированной файловой системы ("/" для

файловой системы с именем "/dev/dsk1" на Рисунке 5.22);

* указатель на индекс каталога, ставшего точкой монтирования (на Рисунке

5.22 это каталог "usr", принадлежащий корневой файловой системе).

Связь индекса точки монтирования с корневым индексом монтированной фай-

ловой системы, возникшая в результате выполнения системной функции mount,

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

чения от пользователей дополнительных сведений.

+------------------------------------------------------------+

| алгоритм mount |

| входная информация: имя блочного специального файла |

| имя каталога точки монтирования |

| опции ("только для чтения") |

| выходная информация: отсутствует |

| { |

| если (пользователь не является суперпользователем) |

| возвратить (ошибку); |

| получить индекс для блочного специального файла (алго- |

| ритм namei); |

| проверить допустимость значений параметров; |

| получить индекс для имени каталога, где производится |

| монтирование (алгоритм namei); |

| если (индекс не является индексом каталога или счетчик |

| ссылок имеет значение > 1) |

| { |

| освободить индексы (алгоритм iput); |

| возвратить (ошибку); |

| } |

| найти свободное место в таблице монтирования; |

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

| данного драйвера; |

| получить свободный буфер из буферного кеша; |

| считать суперблок в свободный буфер; |

| проинициализировать поля суперблока; |

| получить корневой индекс монтируемой системы (алгоритм |

| iget), сохранить его в таблице монтирования; |

| сделать пометку в индексе каталога о том, что каталог |

| является точкой монтирования; |

| освободить индекс специального файла (алгоритм iput); |

| снять блокировку с индекса каталога точки монтирования;|

| } |

+------------------------------------------------------------+

Рисунок 5.23. Алгоритм монтирования файловой системы

На Рисунке 5.23 показан алгоритм монтирования файловой системы. Ядро

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

владельцем которых является суперпользователь.

Ядро находит индекс специального файла, представляющего файловую систе-

му, подлежащую монтированию, извлекает старший и младший номера, которые

идентифицируют соответствующий дисковый раздел, и выбирает индекс каталога,

в котором файловая система будет смонтирована. Счетчик ссылок в индексе ка-

талога должен иметь значение, не превышающее 1 (и меньше 1 он не должен быть

- почему?), в связи с наличием потенциально опасных побочных эффектов.

Затем ядро назначает свободное место в таблице монтирова-

ния, помечает его для использования и присваивает значение полю номера уст-

ройства в таблице. Вышеуказанные назначения производятся немедленно, пос-

кольку вызывающий процесс может приостановиться, следуя процедуре открытия

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

временем попытался бы смонтировать файловую систему. Пометив для использова-

ния запись в таблице монтирования, ядро не допускает использования в двух

вызовах функции mount одной и той же записи таблицы. Запоминая номер устрой-

ства с монтируемой системой, ядро может воспрепятствовать повторному монти-

рованию одной и той же системы другими процессами, которое, будь оно допуще-

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

Ядро вызывает процедуру открытия для блочного устройства, содержащего

файловую систему, точно так же, как оно делает это при непосредственном отк-

рытии блочного устройства . Процедура открытия устройства обычно

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

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

ядро выделяет из буферного пула свободный буфер (вариант алгоритма getblk)

для хранения суперблока монтируемой файловой системы и считывает суперблок,

используя один из вариантов алгоритма read. Ядро сохраняет указатель на ин-

декс каталога, в котором монтируется система, давая возможность маршрутам

поиска файловых имен, содержащих имя "..", пересекать точку монтирования,

как мы увидим дальше. Оно находит корневой индекс монтируемой файловой сис-

темы и запоминает указатель на индекс в таблице монтирования. С точки зрения

пользователя, место (точка) монтирования и корень файловой системы логически

эквивалентны, и ядро упрочивает эту эквивалентность благодаря их сосущество-

ванию в одной записи таблицы монтирования. Процессы больше не могут обра-

щаться к индексу каталога - точки монтирования.

Ядро инициализирует поля в суперблоке файловой системы, очищая поля для

списка свободных блоков и списка свободных индексов и устанавливая число

свободных индексов в суперблоке равным 0. Целью инициализации (задания на-

чальных значений полей) является сведение к минимуму опасности разрушить

файловую систему, если монтирование осуществляется после аварийного заверше-

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

свободные индексы, то это приведет к запуску алгоритма ialloc, ведущего по-

иск на диске свободных индексов. К сожалению, если список свободных дисковых

блоков испорчен, ядро не исправляет этот список изнутри.

Если пользователь монтирует файловую систе-

му только для чтения, запрещая проведение всех операций записи в системе,

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

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

ли ссылаться на нее.

  1. Разновидности файлов. Обычные файлы. Файлы – каталоги. Специальные файлы. Связывание файлов с разными именами.

Соседние файлы в папке ГОСЫ