ошибке.
ПОЯСНЕНИЯ
Строки 4-8 проверяют счетчик аргументов. Если не был указан ни
один аргумент, выводится сообщение об ошибке. Должно быть указано хотя
бы одно имя файла.
Строки 10-14 проверяют, является ли первый символ первого позици-
онного параметра знаком "минус" и отличается ли первая опция от до-
пустимой опции -u. Если эти условия выполняются, выводится сообщение
об ошибке и программа завершается.
Строки 16 и 17 инициализируют установки режимов прав доступа по
умолчанию. MODE1 устанавливается для запрета чтения и записи категори-
ям пользователей "группа" и "другие". MODE2 устанавливается для запре-
та пользователю (т.е. мне) права записи. Это страховка для меня от
случайной записи в файл. Нам нужны две такие переменные, поскольку эти
два режима довольно разные. Единственный способ сделать это - дважды
вызвать команду chmod с двумя различными установками.
Строки 19-23 проверяют, была ли указана в командной строке опция
-u. Если была, она убирается из командной строки командой shift и пе-
ременные режима инициализируются для разблокирования файлов. Строка 21
разрешает возможность чтения группе пользователей и другим. Строка 22
разрешает мне возможность записи. Обратите внимание, что в командном
файле lock не происходит модификации битов x, s или t. Это сделано на-
меренно, поскольку бит x должен быть установлен только в случае, если
файл может быть исполняемым. Для каталогов бит x должен быть установ-
лен только в случае, если вы хотите, чтобы другие пользователи могли
заходить в этот каталог. Мы также никогда не устанавливаем возможность
записи для группы пользователей и для других пользователей, но мы отк-
лючаем ее при блокировании файлов. Это дополнительная мера предосто-
рожности на случай, если файл имеет установленными такие права доступа
к нему, которые мы по каким-то причинам не желаем оставлять.
В строках 25 и 26 выполняется команда chmod. Параметр $@ исполь-
зован как обозначение всех имен файлов, указанных в командной строке.
Такой способ позволяет вам вызывать lock с несколькими именами файлов.
Из последних шести глав вы должны приобрести множество идей о
том, как можно обезопасить среду, в которой вы работаете, как иметь
дело с другими пользователями и вообще более продуктивно использовать
ваш рабочий день. Мы готовы двигаться дальше в понимании системы UNIX
и исследовании внутренней работы файловой системы, устройств и комму-
никаций.
* ГЛАВА 7. Устройства и файловые системы *
ТЕРМИНАЛЬНЫЕ УСТРОЙСТВА
РАБОТА С КЛАВИАТУРОЙ
ФАЙЛЫ termcap
ДИСКОВЫЕ УСТРОЙСТВА
ФАЙЛОВЫЕ СИСТЕМЫ
ЗАГРУЗОЧНЫЙ ДИСК
РАЗМЕРНЫЕ ПАРАМЕТРЫ
c Быстрая очистка экрана
mntf Монтирование гибкого диска в системном дереве
mntlook Поиск всех монтированных файловых систем
umntsys Размонтирование всех файловых систем, кроме
корневой
lrgf Создание файла максимального размера,
допустимого в вашей системе
УСТРОЙСТВА И ФАЙЛОВЫЕ СИСТЕМЫ
ВВЕДЕНИЕ
Ниже уровня известной нам области файловых систем находится мир
устройств и их драйверов. В данной главе мы исследуем некоторые мето-
ды, необходимые для работы с терминалами, дисками и непосредственно
файловыми системами. Программное средство 'c' иллюстрирует доступ к
терминалу на примере операции быстрой очистки экрана. Следующие три
средства - mntf, mntlook и umntsys - имеют дело с монтированием и раз-
монтированием файловых систем. Наконец, средство lrgf позволит вам
проверить пределы емкости вашей файловой системы.
СИСТЕМА UNIX И АППАРАТУРА
Перед тем, как углубиться в сущность вопроса, давайте обсудим не-
которые элементарные факты, которые мы должны помнить при рассмотрении
всех составляющих системы UNIX. Сердцем аппаратуры является централь-
ный процессор (CPU), который исполняет инструкции, управляющие маши-
ной, и фактически осуществляет всю работу. Операционная система необ-
ходима для руководства работой, выполняемой центральным процессором, и
для обеспечения интерфейса между ним и ресурсами, требуемыми для того,
чтобы сделать что-то полезное: оперативной памятью, внешней памятью и
другими периферийными устройствами, такими как терминалы и принтеры.
Операционная система, особенно такая высокоразвитая, как UNIX,
имеет множество утилит и характерных особенностей, но сейчас речь не
об этом. Сердцем операционной системы (в данном случае UNIX) является
ядро (kernel). Ядро управляет процессами и руководит выполняемой рабо-
той. Оно также является своего рода мостом между аппаратурой и внешним
миром. В данной главе мы обратим внимание на основные взаимоотношения
между ядром, процессами и аппаратурой.
В конечном итоге система должна взаимодействовать с внешними уст-
ройствами. Наличие базовых знаний об устройствах весьма важно для пол-
ного понимания того, как UNIX общается с внешним миром.
При работе с машиной много времени тратится на передачу данных в
машину и из нее, а это значит, что необходимо иметь дело со множеством
различных типов устройств, каждое из которых имеет свой "характер" и
особенности.
К нашему счастью, UNIX был разработан так, чтобы облегчить управ-
ление данными и устройствами настолько, насколько это возможно. К на-
шему несчастью, имеется, по всей видимости, несократимый объем знаний,
которыми мы должны овладеть обязательно. На рис. 7-1 показана общая
структура операционной системы UNIX. Мы видим, что со стороны ядра об-
ращение ко всем внешним периферийным устройствам выполняется как к
файлам устройств. Каждый тип устройств имеет свой собственный драйвер
и специфическую архитектуру, но обращение к каждому устройству выпол-
няется одинаковыми методами. Мы увидим, как использовать различные
способы доступа к устройствам и определим, какие способы наиболее эф-
фективны.
Рис. 7-1
Модель среды системы UNIX
---------------------------------------------------------------------------
+-----------+
| |
+------------+ | Магнитная |
| Принтер | | лента |
+------------+ +-----------+
/dev/lp0 lpn /dev/rmt0 .../dev/rmtn
\ | | /
\ | | /
\ | | /
\ \ | | | | / /
+-------------------+------- /dev/fd0
fd:1,2 | +-------------+ |--- +-----------+
/dev/tty00----| | ПРОЦЕССОР | | |Гибкий диск|
+--------+ -- | | ЯДРО | |--- +-----------+
| | / | +-------------+ |-------- fdn
| Экран | +-------------------+
+--------+ / / | | | \ \
+--------+ / | \
|Клавиат.| ttynn /dev/hd01 hdnn
+--------+ +----------+
fd:0 | |
| Жесткий |
| диск |
| |
+----------+
---------------------------------------------------------------------------
UNIX обращается к периферийным устройствам через "специальные
файлы". Имеется два типа специальных файлов: блочные и символьные. Оба
типа имеют свое предназначение и особенности. Блочный (например,
/dev/hd0) использует буферизацию и позволяет получить доступ к большим
объемам данных на жестком диске. Символьный (например, /dev/tty00 или
/dev/rfd0) не использует значительную буферизацию, а выполняет обмен с
устройством по одному символу за обращение. Даже несмотря на особые
свойства таких файлов, для них поддерживается все тот же механизм за-
щиты, что и для всех других файлов в системе.
Первая область, которую мы рассмотрим - терминальные устройства и
работа с ними. Представленные программы включают в себя средство под
названием 'c' для быстрой очистки экрана, а также пример программы,
которая считывает значения нажатых клавиш и выполняет опрос нажатия
одной клавиши. Мы также рассмотрим пример файла описания терминала
(termcap), который обеспечивает доступные определения характеристик
терминала.
Затем мы рассмотрим дисковые устройства - жесткие и гибкие диски.
Мы увидим, что имеются различные способы просмотра разделов диска с
использованием файлов устройств.
В дополнение к работе с устройствами мы рассмотрим файловые
системы на жестком диске. Всем нам известно, что система UNIX сущест-
венно ориентирована на диски, поэтому чем больше мы знаем о файловых
системах, тем лучше для нас. Для более полного понимания разделов
диска и файловых систем мы представим три программных средства.
Средство lrgf проверяет граничные значения параметров файловой системы
путем создания файла наибольшего возможного размера в вашей системе.
Средство mntf обеспечивает удобный способ монтирования и размонтирова-
ния гибких дисков. Наконец, средство mntlook выполняет поиск немонти-
рованных файловых систем, которые представляют собой потенциальную
опасность.
ТЕРМИНАЛЬНЫЕ УСТРОЙСТВА
Драйверы терминальных устройств являются одними из самых сложных
драйверов устройств. Причина этого заключается в том, что существует
множество уровней программного обеспечения, которые поддерживают ха-
рактеристики интерактивных терминалов. При работе терминала по после-
довательной линии связи необходима мощная поддержка для того, чтобы
облегчить его использование. Различные установки, которые может иметь
терминал, программируются командами stty(1) и ioctl(2). Команда
termio(7) также описывает различные аспекты протокола работы термина-
ла.
ПРОТОКОЛ ОПЕРАЦИЙ ВВОДА/ВЫВОДА ТЕРМИНАЛА
Протокол работы терминала представляет собой согласованный набор
сигналов, позволяющих системе правильно интерпретировать вводимые с
клавиатуры строки. Протокол необходим по четырем причинам. Первой яв-
ляется поддержка входной обработки специальных символов, таких как
символы удаления и прекращения работы программы. Во-вторых, нам необ-
ходимо поддерживать обработку выводимой информации, например, вставку
символов задержки или изменение последовательности возврат каретки/пе-
ревод строки. Третьей причиной является поддержка режимов необработан-
ного и "канонического" ввода. Эти два режима позволяют пользова-
тельским программам получать данные или по одному символу, или по од-
ной строке. Последняя причина введения терминального протокола - жела-
ние сделать так, чтобы пользователь мог сам изменять параметры конфи-
гурации терминала.
Содержимое терминальной подсистемы показано на рис. 7-2. Рисунок
разбит на три части: слева - область пользователя, посредине - область
ядра и справа - область устройства. Этот рисунок показывает, как пере-
даются данные между терминалами и программами пользователя.
Рис. 7-2.
Управление протоколом терминала
---------------------------------------------------------------------------
Область Область ядра Область
пользователя устройства
Процесс
+-------+ : :
|Текст | : +--------+ +--------+ +-------+ : dzrint()
|-------| : ttread() |канонич.| canon()|необраб.| ttin()|приемн.| : +-----+
|Данные | : /---|очередь |<-------|очередь |<------|буфер |<--|dbuf |