Министерство общего и профессионального образования Российской Федерации Пермский государственный технический университет Кафедра Информационных технологий и Автоматизированных систем Кузнецов Д. Б., Синельников М. С., Мельников С. А. Симулятор операционной системы на микроядре Методические указания к выполнению лабораторных работ по дисциплине "Операционные системы" для студентов специальностей АСУ и ЭВТ Пермь, 2005 2 Лабораторная работа №1 Знакомство с симулятором микроядра cmic. 1. Содержание работы. Имеется симулятор микроядра cmic. Реализованы процедуры создания межпроцессного канала для записи данных в память машины. Задача состоит в эмуляции системного вызова к памяти с целью чтения из нее этих данных. Т.е., должны быть реализованы процедуры для чтения данных из памяти. 2. Краткие теоретические сведения. В отличие от традиционной архитектуры, согласно которой операционная система представляет собой монолитное ядро, реализующие основные функции по управлению аппаратными ресурсами и организующее среду для выполнения пользовательских процессов, микроядерная архитектура распределяет функции ОС между микроядром и входящими в состав ОС системными сервисами, реализованными в виде процессов, равноправных с пользовательскими приложениями. Микроядро реализует базовые функции операционной системы, на которые опираются эти системные сервисы и приложения. В результате, такие важные компоненты ОС как файловая система, сетевая поддержка и т. д. превращаются в по-настоящему независимые модули, которые функционируют как отдельные процессы и взаимодействуют с ядром и друг с другом на общих основаниях. Это означает, что имевшее место раньше четкое разделение программного обеспечения на системные и прикладные программы размывается, т. к., фактически, между процессами, реализующими функции ОС, и прикладными процессами, выполняющими программы пользователя, нет никаких различий. Все компоненты системы используют средства микроядра для обмена сообщениями, но взаимодействуют непосредственно. Микроядро лишь проверяет законность сообщений, пересылает их между компонентами и обеспечивает доступ к аппаратуре. В основе архитектуры микроядерных ОС лежат следующие базовые концепции: - минимизация набора функций, поддерживаемых микроядром, и реализация традиционных функций ОС (файловая система, сетевая поддержка) вне микроядра; - организация синхронного и асинхронного взаимодействия между процессами исключительно через механизм обмена сообщениями; - все отношения между компонентами строятся на основе модели клиент/сервер; - применение объектно-ориентированного подхода при разработке архитектуры и программировании системы. Микроядро отвечает за выполнение следующих функций: связь между процессами - Микроядро управляет маршрутизацией сообщений; оно также поддерживает две другие формы IPC - прокси и сигналы; сетевой интерфейс низкого уровня - Микроядро осуществляет доставку всех сообщений, предназначенных для процессов на других узлах сети; диспетчеризация процессов - входящий в состав Ядра планировщик решает, какому из запущенных процессов должно быть передано управление; 3 первичная обработка прерываний - все аппаратные прерывания и исключения сначала проходят через Микроядро, а затем передаются соответствующему драйверу или системному менеджеру. PIPE. pipe - создание неименованного канала int pipe (fildes) int fildes [2]; ОПИСАНИЕ Системный вызов pipe создает механизм ввода/вывода, называемый каналом, и возвращает два дескриптора файла fildes[0] и fildes[1]. Дескриптор fildes[0] открыт на чтение, дескриптор fildes[1] - на запись. Канал буферизует до 5120 байт данных; запись в него большего количества информации без считывания приведет к блокированию пишущего процесса. Посредством дескриптора fildes[0] информация читается в том же порядке, в каком она записывалась с помощью дескриптора fildes[1]. Системный вызов pipe завершается неудачей, если выполнено хотя бы одно из следующих условий: Превышается максимально допустимое количество файлов, открытых одновременно в одном процессе. Переполнена системная таблица файлов. При успешном завершении результат равен 0; в случае ошибки возвращается -1, а переменной errno присваивается код ошибки. 4 Процесс - это последовательность операций при выполнении программы, которая представляет собой наборы байтов интерпретируемые ЦП, как машинные инструкции. Он состоит из текста, данных и стека. Под текстом понимаются код, машинные инструкции. Все процессы создаются системным вызовом fork(). Посмотреть системные процессы можно либо командой ps либо pstree. FORK. fork - создание нового процесса int fork ( ) ОПИСАНИЕ. Вызов fork приводит к созданию нового процесса (порожденного процесса) точной копии процесса, сделавшего вызов (родительского процесса). Точнее, порожденный процесс наследует у родительского процесса следующие характеристики: 1. Окружение. 2. Флаг "закрыть при выполнении вызова exec". 3. Способы обработки сигналов (то есть SIG_DFL, SIG_IGN, SIG_HOLD, адреса функций обработки сигналов). 4. Разрешение переустанавливать действующий идентификатор пользователя. 5. Разрешение переустанавливать действующий идентификатор группы. 6. Состояние профилирования (включено/выключено). 7. Значение поправки к приоритету. 8. Все присоединенные разделяемые сегменты памяти . 9. Идентификатор группы процессов. 10. Идентификатор группы терминала. 11. Текущий рабочий каталог. 12. Корневой каталог. 13. Маска режима создания файлов. 14. Ограничение на размер файла. Порожденный процесс отличается от родительского процесса следующим: 1. Порожденный процесс имеет свой уникальный идентификатор процесса. 2. Порожденный процесс имеет иной идентификатор родительского процесса, равный идентификатору процесса, его породившего. 3. Порожденный процесс имеет свои собственные копии родительских дескрипторов файлов. Каждый дескриптор файла порожденного процесса разделяет с соответствующим родительским дескриптором файла общий указатель текущей позиции в файле. 4. Все semadj значения сбрасываются . 5. Порожденный процесс не наследует у родительского процесса признаков удержания в памяти сегмента команд, данных или всего процесса целиком . 6. Обнуляются счетчики времени, потраченного для обслуживания этого процесса (tms_utime, tms_stime, tms_cutime, tms_cstime). Отменяется запрос к будильнику. Системный вызов fork завершается неудачей и новый процесс не порождается, если выполнено хотя бы одно из следующих условий: Создать процесс запрещает системное ограничение на общее количество процессов. Создать процесс запрещает системное ограничение на количество процессов у одного пользователя. 5 Общее количество системной памяти, предоставленной для физического ввода/вывода, временно оказалось недостаточным. При успешном завершении порожденному процессу возвращается 0, а родительскому процессу возвращается идентификатор порожденного процесса. В случае ошибки родительскому процессу возвращается -1, не создается нового процесса и переменной errno присваивается код ошибки. 3. Контрольные вопросы. 1. Перечислите основные функции ядра. 2. Где хранятся сообщения? 3. Как реализована обратная посылка сообщения? 4. Что нужно сделать, чтобы добавить вызов? 5. Где хранятся сообщения? 6. Как устанавливается отношение сообщение-модуль? 7. Что делает системный вызов pipe, и в каких случаях он завершается неудачей? 8. Расскажите о системном вызове fork. 9.Где реализуется вызов cm_mem_wr? Лабораторная работа №2 Управление файловой системой на низком уровне. 1. Содержание работы. Проведение операций с элементами (файл, инод, блоки данных) файловой системы UNIX. 2. Краткие теоретические сведения. Файловая система UNIX в частности характеризуется: - иерархической структурой - согласованной обработкой массивов данных - возможностью создания и удаления файлов - динамическим расширением файлов - защитой информации в файлах - трактовкой периферийных устройств(таких, как терминалы и ленточные устройства) как файлов. Файловая система организована в виде дерева с одной исходной вершиной, которая называется корнем (записывается: '/'); каждая вершина в древовидной структуре файловой системы, кроме листьев, является каталогом файлов. Корневой каталог имеет вид: 6 bin boot dev etc home lib mnt proc root sbin tmp usr var Двоичные коды наиболее важных команд Статические файлы загрузчика boot Файлы устройств Файлы настройки конфигурации системы Домашние каталоги пользователей Разделяемые библиотеки Точка монтирования временно подключаемых систем Псевдо-файловая система с информацией о процессах Домашний каталог (пользователя) root Наиболее важные системные двоичные коды Временные файлы Вторая главная иерархия Переменные данные Каждый из этих, а также расположенных на других уровнях, каталогов имеет строго определенное назначение, что обеспечивает удобство работы с файловой системой. Устройство файловой системы: В суперблоке содержится информация о системе в целом, т.е. тип, размер, размер блока ( 512, 1024, 2048 ), число свободных блоков, число свободных инодов, список свободных блоков, список свободных инодов. В списке свободных инодов находится ограниченное число инодов. В этом списке содержатся ссылки на иноды в таблице инодов. По мере захвата инодов 7 можно перечитать таблицу инодов с целью её заполнения. Когда список инодов пустеет, тогда ОС просматривает таблицу инодов и пополняет его. В списке свободных блоков содержатся ссылки на все свободные блоки данных. Инод – запись содержащая информацию о файле и его размещении. Инод содержит информацию о: типе файла, времени доступа и последней модификации файла, атрибутах(чтение, запись, исполнение), идентификаторах пользователя и группы(UID, GID), размере. Там также содержатся прямые и косвенные ссылки на блоки данных. Прямой ссылкой можно адресовать файл в 1кб. Косвенная ссылка содержит ссылку на блок, содержащийся в области блоков данных, который содержит ссылки на блоки ей можно адресовать 256 кб. Ссылка двойной косвенности содержит ссылку на блок, который содержит ссылки на блоки, которые содержат ссылки на блоки. Адресовать можно около 50 мб (256*256). В иноде указывается число ссылок на этот инод. Т.е. сколько имен у этого файла. Сами же имена файлов содержатся с специализированных файлах (называемых директории или каталоги). В директории 14 кб отводится под имя файла и 2 кб на ссылку на номер инода. Команда unlink удаляет ссылку. 3. Варианты заданий. 1. Создание инода Параметры: отсутствуют Результат: номер созданного инода 2. Удаление ссылки на инод Параметры: номер удаляемого инода Результат: код возврата (1/0) 3. Увеличение размера файла на 1 Параметры: отсутствуют Результат: код возврата (1/0) 4. Уменьшение размера файла на 1 Параметры: отсутствуют Результат: код возврата (1/0) 5. Восстановление списка свободных блоков Параметры: отсутствуют Результат: код возврата (1/0) 6. Определение физического адреса на носителе по смещению от начала файла Параметры: смещение Результат: адрес 7. Запись в файл символа по смещению от начала файла Параметры: смещение, символ Результат: код возврата (1/0) 4. Контрольные вопросы. 1. Как организована файловая система UNIX? 8 Что такое inode и каково его строение? Какого рода информацию содержит суперблок? Где хранятся имена файлов? Что происходит, когда список свободных инодов пустеет? Файл какого размера можно адресовать ссылкой двойной косвенности, если размер блока составляет 256? 7. в чем отличие журналируемой файловой системы от не журналируемой? 8. Что такое виртуальная файловая система? 9. Чем отличается файловая система UNIX от LINUX? 2. 3. 4. 5. 6. Лабораторная работа №3. Программирование виртуальной памяти. 1. Содержание работы. Предоставить по запросу (системному вызову) область виртуальных адресов и, производя трансляцию адресов (виртуальный адрес -> физический), выдавать запрашиваемые данные. Материал: файл cm_mm.c содержит начало модуля, который необходимо написать в процессе лабораторной работы. В нем создана область N 0, заполнена данными в одной из ячеек размещается символ 'g', и одна из страниц перенесена в swap. 2. Краткие теоретические сведения. Рассмотрим, как в системе происходит операция свопирования. Функции подсистемы управления памятью: 1. Решает, какие процессы следует размещать в памяти. 2. Управляет участниками виртуального пространства. 3. Переписывает процессы во внешнюю память. 4. Помещает данные с устройства выгрузки в основную память. Существует две стратегии управления памятью: Своппинг (swap) –это, когда основная память обменивается с устройством выгрузки процессами целиком. Подкачка по обращению (demand paging) – обмен производится страницами. Свопинг. Рассмотрим три основных функции своппинга: 1. Управление пространством в свопе (на устройстве выгрузки). 2. Выгрузка процессов. 3. Подкачка процессов. Управление пространством в свопе. Своп — это устройство блочного типа, чаще всего раздел диска. Если в файловой системе используются суперблоки, то в свопе используется карта памяти устройства. Карта состоит из строк, в которых содержится адрес распределяемого ресурса и количество единиц этого ресурса. В начальный момент в карте памяти устройства одна строка Выгрузка процесса в своп Производится когда возникает системный вызов fork. Когда процесс увеличивает свои размеры 9 Когда необходима процессу необходима физическая память Выгрузкой/загрузкой процессов занимается процесс подкачки. Он всегда выполняется в режиме ядра и имеет номер 0. Алгоритм выгрузки 1. Процесс подкачки уменьшает счётчик числа ссылок на область на 1. 2. Выделяет место в SWAP. 3. Блокирует процессы в памяти. 4. Выгружает из областей, где счётчик числа ссылок равен 0, непустые страницы через КЭШ. Загрузка или подкачка процесса SWAPPER— название алгоритма. 1. Выбирают готовый к выполнению процесс, дольше всех лежащий в свопе (если нет подходящих, то делают приостанов). 2. Загружают его. Выгрузка 1. Выбирают процесс, который дольше спит (или дольше всего в памяти) 2. Выгружают его. Подкачка по запросу (по обращению) Demand paging Основная память обменивается с внешней памятью не процессами, а страницами. Этот способ должен иметь аппаратную поддержку: страничную организацию памяти и центральный процессор, имеющий прерываемые команды. Отсутствуют ограничения на размер процесса, обусловленные объёмом физической памяти. Рабочее множество процесса Это совокупность страниц, использованных процесом в последних n-ссылках. n — окно рабочего множества. 10 Когда процесс обращается к странице, отсутствующей в его рабочем множестве, возникает ошибка, при обработке которой ядро корректирует рабочее множество процессов, а в случае необходимости подкачивает страницы с внешнего устройства. Ошибки — это обращения к несуществующим страницам. Откачка страниц Сборщик страниц — процесс, принадлежащий ядру и выполняющий выгрузку из памяти тех страниц, которые больше не входят в состав рабочего множества пользовательского процесса. Запускается в любой момент, когда в нём возникает необходимость. Он просматривает все активные незаблокированные области и увеличивает значение возраста принадлежащим им страницам. У страницы два состояния — либо она дозревает, либо она готова к выгрузке. 11 Процесс старения В ядре при компиляции задаются две отметки: Ядро возобновляет работу сборщика страниц, когда доступная свободная память имеет размер недотягиваюший до нижней допустимой отметки. Обработка ошибок. Существует два вида ошибок при обращении к странице: 1. отсутствие данных; 2. отказ системы защиты. Когда процесс пытается обратиться к недоступной странице, возникает прерывание, и процессор запускает программу обработки прерываний по отказу данного типа. Если информация отсутствует в системе, то ядро посылает процессу сигнал нарушения сегментации. Если ссылка на страницу сделана правильно, то ядро выделяет физическую страницу в памяти и считывает в неё содержимое виртуальной страницы с устройства выгрузки или из исполняемого файла. 3. Варианты заданий. 1. Обработка запроса "создать область" ("cm_mm_mk"). Параметр: число страниц в области. Результат: дискриптор созданной области. 2. Занести/извлечь данные (2 разных запроса) Параметры: первый - адрес, куда заносить, второй (только для занесения) - символ который надо занести Результат: код возврата(1/0) или полученный символ. 3. Увеличить/уменьшить область (2 разных запроса) Параметр: число страниц, которые надо добавить/отрезать. Результат: код возврата(1/0). 4. Откачать несколько случайных страниц из памяти в swap Параметр: число страниц, которые надо откачать. Результат: код возврата(1/0). 12 5. Подкачать нужную страницу в память Параметр: номер страницы, которую надо подкачать. Результат: код возврата(1/0). 4. Контрольные вопросы. 1. Назовите основные функции подсистемы управления памятью? 2. Что такое свопинг? 3. Когда происходит выгрузка процесса в своп? 4. Может ли в режиме свопирования выполнятся процесс, если он больше оперативной памяти? 5. Расскажите о подкачке по запросу. 6. Что такое рабочее множество процесса? 7. Почему фиксированное окно рабочего множества сейчас не используется? Приложение 1. Команды SHELL. shell - это одна из многих команд UNIX. То есть в набор команд оболочки (интерпретатора) 'shell' входит команда 'sh' - вызов интерпретатора 'shell'. Первый 'shell' вызывается автоматически при входе в систему и выдает на экран промтер. После этого можно вызывать на выполнение любые команды, в том числе и снова сам 'shell', который создаст новую оболочку внутри прежней. Shell обрабатывает команды трех типов: - Во-первых, в качестве имени команды может быть указано имя исполняемого файла в объектном коде, полученного в результате компиляции исходного текста программы (например, программы на языке Си). - Во-вторых, именем команды может быть имя командного файла, содержащего набор командных строк, обрабатываемых shell'ом. - В-третьих, команда может быть внутренней командой языка shell (в отличие от исполняемого файла). Наличие внутренних команд делает shell языком программирования в дополнение к функциям командного процессора; командный язык shell включает команды организации циклов (for-in-do-done и while-dodone), команды выполнения по условиям (if-then-else-fi), оператор выбора, команду изменения текущего для процесса каталога (cd) и некоторые другие. Синтаксис shell'а допускает сравнение с образцом и обработку параметров. Пользователям, запускающим команды, нет необходимости знать, какого типа эти команды. Командный процессор shell ищет имена команд в указанном наборе каталогов, который можно изменить по желанию пользователя, вызвав shell. Shell обычно исполняет команду синхронно, с ожиданием завершения выполнения команды прежде, чем считать следующую командную строку. Тем не менее, допускается и асинхронное исполнение, когда очередная командная строка считывается и исполняется, не дожидаясь завершения выполнения предыдущей команды. О командах, выполняемых асинхронно, говорят, что они выполняются на фоне других команд. Простейшие средства Shell : ; - последовательное выполнение команд пр.:sleep 20 ; reboot & - асинхронное (фоновое) выполнение предшествующей команды 13 пр.:cc pr.c & - && - выполнение последующей команды при условии нормального завершения предыдущей пр.:mkdir sun && rmdir sun - || - выполнение последующей команды при условии ненормального завершения предыдущей пр.: cd sun || mkdir sun - {} – для группировки команд в блок - () – кроме выполнения функции группировки, выполняют и функцию вызова нового экземпляра интерпретатора shell - . – для выполнения программы из файла в текущем Shell–е Стандартный вход и выход. Перенаправление. 'stdin' – стандартный ввод осуществляется с клавиатуры терминала 'stdout' – стандартный вывод направлен на экран терминала 'stderr' – стандартный файл диагностических и отладочных обобщений Работа с ними осуществляется как с файлами. stdin 0 stdout 1 stderr 2 Эти файлы можно переопределять регулярными файлами. Пользователь имеет удобные средства перенаправления ввода и вывода на другие файлы (устройства). Символы '>' и '>>' обозначают перенаправление вывода. Пр.:команда > f2 В этом случае f2 создастся. Если он существовал до этого, то он обнулится. Для того, чтобы файл не обнулялся нужно использовать: Пр.:команда >> f2 Символы '<' и '<<' обозначают перенаправление ввода. Пр.:команда < f1 Перенаправление вывода команды в строчку осуществляется с помощью: Пр.:\ команда \ Например, cd \ pwd \ Символ '|' используется для организации конвеера между командами. Это обозначает, что стандартный выход одной направляется на стандатный вход другой. Пр.: dir | more dir выдаёт файлы, а с помощью more их построчно выводит. Поскольку shell является пользовательской программой и не входит в состав ядра операционной системы, его легко модифицировать и помещать в конкретные условия эксплуатации. Некоторые полезные команды. sh - вызывает командный процессор. Shell может работать в двух режимах: интерактивном режиме (режиме командной строки) и режиме выполнения программы. Символ “$” в начале строки обозначает, что shell находится в интерактивном режиме и готов к вводу команд. Синтаксис: sh [опции] [программа_на_shell] Пример: $ sh prog.sh 14 man – выдает справку cp - копирует файлы. Можно скопировать один файл в другой или список файлов в каталог. Синтаксис: cp исходный_файл файл_назначения или ср исходный_список каталог_назначения где: исходный_файл - это файл, который нужно скопировать; файл_назначения - имя файла, в который будет скопирован исходный_файл; исходный_список - это список файлов для копирования, разделенных пробелами; каталог_назначения - это каталог, куда копируются файлы. Пример: $ cp a.txt /tmp mv - пересылает или переименовывает файл. Синтаксис: mv [-fi] oldfile newfile mv [-fi] file... destination_directory Команда mv в первой форме пересылает(или изменяет) файл oldfile c превращением его в newfile.Команда mv во второй форме пересылает один или несколько файлов в каталог destination_directory. Пример: $ mv f1.txt f2.txt who - показывает пользователей, вошедших в систему. Синтаксис: who [am i] Команда who показывает Unix-имена пользователей, которые к данному времени вошли в систему. Команда who am i показывает ваше входное имя. echo - берет аргументы, которые ей передали, и записывает их в стандартный вывод. Синтаксис: echo [-n] строка где: -n - это ключ, который подавляет особенность выводить все выходные данные с новой строки. Пример: $ echo “Hello All!” date – устанавливает/выводит системную дату и время. Синтаксис: date MDhmY где: M - месяц(01-12); D - день(01-31); h - час(00-23); m - минуты(00-59); Y год(00-99). cat - связывает или соединяет файлы вместе. Эту команду также можно использовать для вывода файла на экран. Если никакие файлы не указаны, команда cat читает со стандартного ввода. Синтаксис: cat [ключи] [список_файлов] Пример: 15 $ cat f1 f2 > f3 mkdir - создает каталог. Синтаксис: mkdir название_каталога Пример: $ mkdir v10/a file - определяет тип файла. Синтаксис: file [ключи] [список-файлов] ключи: -f - проверяет файлы из списка type - указывает физическое нахождение вызванной порграммы. Пример: $ type myprog Результатом действия является: /bin/myprog find - просматривает список каталогов, отыскивая файлы удовлетворяющие некоторому критерию. Сиснтаксис: find [список_каталогов] [спецификация_сопоставления] Спецификация_сопоставления определяет условия соответствия для искомых файлов и может принимать следующие значения: -name файл - заставляет команду find искать указанный файл; -print - выводит имена найденных файлов. Пример: $ find . -name myfile -print (поиск файла с именем myfile ведется в текущем каталоге и его подкаталогах, когда файл найден, на экран выводится полное имя маршрута к нему). grep - отыскивает текст в файлах. Синтаксис: grep [-il][-e]expression[file...] ключи: -е expression -здесь expression есть отыскиваемый текст. Для задания одного выражения указывать -е перед ним не нужно.Если выражение expression содержит пробелы, они должны быть заключены в кавычки. -i - игнорирует различие прописных и строчных букв. -l - вместо показа соответствующих строк выводит только файлы, имеющие соответствия. Пример: для отыскания всех файлов в текущем каталоге, содержащих слово "john", применяется команда: $ grep -i john wc - выводит число строк, слов и символов в файле. Синтаксис: wc [-clw] file... Команда wc подсчитывает число символов, строк и слов в файле или файлах. Ключи: -c -подсчитывает только число символов. -l -подсчитывает только число строк. -w -подсчитывает только число слов. 16 cal - отображает календарь в стандартный вывод. По умолчанию берется текущий месяц и год. Синтаксис: cal [месяц] [год] Пример: $ cal 2000 (выводит календарь на 2000 год). diff - сравнивает два текстовых файла и сообщает, что должно быть сделано, чтобы один из них стал подобен другому. Синтаксис: diff [ключи] старый_файл новый_файл Shell-переменные Пользователям предоставляется возможность определять переменные и присваивать им значения. Имя переменной должно начинаться с буквы или символа подчеркивания. Примеры: k7, _ufile, chaos,... Присвоение значений переменным Значение переменным присваивается по команде присваивания. Например: $ var=length означает, что переменной var присвоено значение length. Самой length можно в свою очередь, присвоить значение $ length=80 Если присваивается значение строки символов, то предпочтительно, чтобы эта строка была заключена в кавычки. Если в строке символов встречаются пробелы, то кавычки обязательны. В отличие от других языков программирования переменные Shell не связаны с определенным типом данных. Любое значение, которое присваивается переменным Shell, воспринимается как строка символов. Вывод содержимого переменных Чтобы получить доступ к переменной, нужно непосредственно перед именем переменной поставить знак доллара($): $ var=80 $ echo $var 80 $ Двойные кавычки Любой символ, который имеет специальное значение для Shell(как, например, *, ?, <, >, >>), утрачивает свой интерпретационный статус. Исключениями здесь являются символ $, обратный апостроф и обратная наклонная черта, если она предшествует специальному символу. Пример: представим, что текущий каталог содержит следущие файлы: $ ls textsdocums sourse $ Теперь посмотрим результат двух команд echo: 1) $ echo * 17 textsdocums sourse $ 2) $ echo "*" * $ В первом случае Shell заменяет звездочку на имена всех файлов в каталоге. Во втором случае кавычки отменяют специальные значения символа *. Апостроф Рассмотрим следующий пример: $ message="Hello Victor!" $ echo $message Hello Victor! $ echo "$message" Hello Victor! $ В обоих случаях получаем одинаковый результат, однако если мы заключим переменную message в апострофы, то получим следущее: $ echo '$message' $message $ Как видим, когда переменная находится в апострофах, ее значение не подставляется в качестве результата. Обратнонаклонная черта и символы(\n, \c, \t) Обратнонаклонная черта, будучи поставлена перед символом, ликвидирует его специальное значение для Shell. $ echo \$message $message $ echo \\ \ $ Последний пример показывает, что \ можно использовать перед другой \ , чтобы ликвидировать значение последней. \n - перемещение в следующий ряд; \с - остаться в той же строке; \t - перемещение до позиции следующей табуляции; Пример: $ echo "1 \t2 \t3 \t4 \t5" 1 2 3 4 5 $ Оператор for Общий вид оператора for: for переменная in список do команда команда ... 18 done Значение цикла: выполнение списка команд, заключенного между ключевыми словами "do" и "done", один раз для каждого значения из списка. При этом очередное выбираемое значение из списка присваивается переменной, имя которой указано слева от ключевого слова "in". Оператор if Общий вид оператора if: if условие then команда команда ... fi Если условие истинно (true), команды, которые находятся между then и fi, будут исполнены, в противном случае - будут пропущены. Общий вид оператора if - else if условие then команда команда ... else команда команда ... fi Если результат условия true, то исполняются команды, находящиеся между then и else, в противном случае исполняются команды между else и fi. В обоих случаях используется только одна группа команд. Операторы while и until Оператор while повторяет заданную группу команд, если условие выполнения соответствует истине. Поскольку условие проверяется перед выполнением списка команд, возможна ситуация, когда список не будет выполнен ни разу. Формат оператора while: while условие do команда команда ... done В операторе until повторение цикла происходит до тех пор, пока проверка условия дает значение false (ложь). Оператор case Оператор case удобен для организации ветвления программы на основе совпадения шаблонов (образцов). Формат оператора case: 19 case переменная in шаблон1) команда команда ... команда;; шаблон2) команда команда ... команда;; шаблонN) команда команда ... команда;; esac 1. 2. 3. 4. 5. Библиографический список Робачевский А.М. Операционная система UNIX: Учеб. пособие для вузов.СПБ: BHV-СПБ, 2000.- 514с. Иртегов Д.В. Введение в операционные системы. - СПБ: БХВ-Питербург, 2002.- 624с. Рейчард К., Фостер-Джонсон Э. UNIX.- СПБ: Питер, 1999.- 374с. Келли-Бутл С. Введение в UNIX: Пер. с англ.- М.: Лори, 1997.- 341с. Морис Бах. Архитектура Unix. http://lib.ru/LINUXGUIDE/