Операционные системы (В.П. Коцубинский, 2016 г., 244 с.)
Целью выполнения данного лабораторного курса является обучение студентов использованию командного языка UNIX, то есть языка shell.
Лабораторный курс предназначен для выполнения в среде реальной UNIX, установленной в учебном классе. При этом локальная сеть, объединяющая компьютеры класса, может находиться под управлением любой сетевой ОС, поддерживающей протоколы связи с UNIX-системой, выполняемой на одном из компьютеров класса или вне его. При отсутствии такого класса допускается выполнение лабораторных работ в среде локальных UNIX-систем.
Конечной отчетной формой для всех лабораторных работ является отчет, выполненный в текстовом редакторе в формате *.doc, *.docx или *.odt, с указанием на титульном листе выходных данных студента, описанием пунктов выполненной работы и выводами по итогам лабораторной работы.
Для лабораторных работ № 1 и 2 разбиения по вариантам нет, в лабораторных работах № 3 и 4 выбор осуществляется по общим правилам с использованием следующей формулы:
V = (N × K) div 100,
где V – искомый номер варианта,
N – общее количество вариантов,
div – целочисленное деление,
при V = 0 выбирается максимальный вариант,
K – код варианта.
Лабораторная работа № 1. Первоначальное знакомство с UNIX
Целью выполнения настоящей лабораторной работы является получение начальных навыков работы в среде UNIX: 1) знакомство с текстовым редактором ed; 2) применение команд shell для работы с файлами; 3) использование в командах shell метасимволов и перенаправление ввода-вывода; 4) запуск конвейеров программ; 5) применение в командах shell переменных; 6) построение командных файлов; 7) изменение прав доступа к файлам.
Задание
Для успешной сдачи работы требуется выполнить наизусть следующие операции:
1) создать два трехуровневых поддерева каталогов и поместить в один из каталогов четыре текстовых файла, два из которых имеют в своем имени одинаковую символьную последовательность, называемую далее «словом»;
2) с помощью ed отредактировать текстовый файл;
3) вывести файл на экран;
4) выполнить добавление текста в начало, в середину и в конец файла;
5) вывести файл на экран;
6) произвести переименование файла;
7) выполнить копирование файла (исходный файл и файл-копия должны располагаться в разных каталогах);
8) поместить в любой другой каталог скрипт, имеющий два входных параметра: имя каталога и набор символов. Скрипт выполняет действия:
- вывод на экран перечня файлов, «дочерних» к заданному каталогу, которые имеют в своем имени заданный набор символов;
- уничтожение всех остальных файлов заданного каталога;
- любые другие действия (по вашему желанию);
9) создать свой инициализационный скрипт, выполняющий действия:
- здоровается;
- «переделывает» приглашения shell;
- запускает вложенный скрипт, созданный в (8), задав ему в качестве параметров каталог и «слово» из (1);
- любые другие действия (по вашему желанию);
10) выйти из UNIX, а затем войти вновь с целью демонстрации результатов выполнения инициализационного скрипта.
Примечание 1. При выполнении задания разрешается использовать те средства shell, которые рассмотрены в данной работе. В частности нельзя применять управляющие операторы (рассматриваются в следующей работе).
Примечание 2. Для избирательного удаления файлов в (8) рекомендуется использовать команду rm с флагом -i, предварительно установив права доступа к файлам. При этом для обеспечения автоматического выполнения rm ее стандартный ввод должен быть переключен на вспомогательный файл, содержащий любой символ кроме «y».
Лабораторная работа № 2. Управляющие операторы командного языка
Целью выполнения настоящей лабораторной работы является развитие навыков программирования на языке shell путем использования в скриптах управляющих операторов if, case, for, while, until.
Задание
Требуется разработать программу на языке shell (без использования команды find), выполняющую поиск в заданном поддереве файловой структуры всех файлов, имена которых отвечают заданному шаблону. Результатом работы программы является перечень имен искомых файлов на экране.
Примечание. Программа состоит из двух скриптов. Главный скрипт выполняет вывод на экран приглашения ввести с клавиатуры имя-путь начального каталога и шаблон поиска. Далее он выполняет ввод этих данных с клавиатуры и выводит на экран перечень искомых файлов в начальном каталоге поиска (если они там есть). Затем он вызывает для каждого подкаталога вложенный скрипт, передав ему два входных параметра: 1) относительное имя подкаталога; 2) шаблон поиска.
Вложенный скрипт выполняет поиск в заданном каталоге искомых файлов, а для каждого подкаталога вызывает точно такой же скрипт. (При выполнении любого скрипта запускается новый экземпляр shell, поэтому рекурсивное выполнение скриптов не приводит к каким-либо трудностям.)
Лабораторная работа № 3. Операции с файлами в программе на языке Си
Целью выполнения настоящей лабораторной работы является получение начальных навыков использования системных вызовов UNIX в программах на языке Си. Данные вызовы выполняют основные операции с файлами: открытие и создание, чтение и запись, закрытие и уничтожение.
Задание
Требуется разработать одну из следующих программ:
1) копирование файла (имя старого и нового файла передаются в командной строке), используя системные вызовы;
2) копирование файла (имя старого и нового файла передаются в командной строке), используя стандартные функции;
3) вывод на экран содержимого текстового файла, имя которого задается в командной строке, используя системные вызовы;
4) вывод на экран содержимого текстового файла, имя которого задается в командной строке, используя стандартные функции;
5) ввод с клавиатуры содержимого текстового файла, имя которого задается в командной строке, используя системные вызовы;
6) ввод с клавиатуры содержимого текстового файла, имя которого задается в командной строке, используя стандартные функции;
7) ввод с клавиатуры содержимого текстового файла, имя которого задается в командной строке, используя системные вызовы и вывод его на экран, используя системные вызовы;
8) ввод с клавиатуры содержимого текстового файла, имя которого задается в командной строке, используя стандартные функции и вывод его на экран, используя системные вызовы;
9) ввод с клавиатуры содержимого текстового файла, имя которого задается в командной строке, используя системные вызовы и вывод его на экран, используя стандартные функции;
10) ввод с клавиатуры содержимого текстового файла, имя которого задается в командной строке, используя стандартные функции и вывод его на экран, используя стандартные функции.
Лабораторная работа № 4. Обработка сигналов
Целью выполнения настоящей лабораторной работы является получение навыков программного управления процессами с помощью сигналов.
Примечание. Для получения номера своего процесса можно
использовать функцию getpid:
#include
pid_t getpid(void);
Задание
Разработать одну из следующих программ:
1. Процесс-отец порождает четыре дочерних процесса, каждый из которых выполняет бесконечный цикл. Далее в течение 10 секунд процесс-отец выводит на экран какое-то сообщение. По истечении этого времени он уничтожает два из четырех процессов, используя для этого всего одну команду. Перед завершением процесс-отец выводит на экран перечень процессов данного пользователя.
2. Процесс-отец порождает четыре дочерних процесса, каждый из которых выполняет бесконечный цикл. Далее в течение 15 секунд процесс отец выводит на экран какое-то сообщение. По истечении этого времени он уничтожает три из четырех процессов, используя для этого всего одну команду. Перед завершением процесс-отец выводит на экран перечень процессов данного пользователя, предваряя их текстовой строкой hi!:.
3. Процесс-отец порождает четыре дочерних процесса, каждый из которых выполняет бесконечный цикл. При этом каждый из дочерних процессов особым образом реагирует на сигнал SIGINT:
- процесс 1 при получении сигнала SIGINT выводит сообщение на
экран и продолжается;
- процесс 2 обрабатывает сигнал SIGINT в бесконечном цикле, выдавая свое сообщение на экран. Данный цикл защищен от воздействия сигнала SIGQUIT;
- вся программа процесса 3 защищена от воздействия сигнала SIGINT;
- перед входом процесса 4 в бесконечный цикл для него меняется идентификатор сеанса.
Сразу после порождения дочерних процессов процесс-отец завершается.
Далее следует проверить реакцию оставшихся процессов на сигналы SIGINT и SIGQUIT.
4. Процесс-отец порождает четыре дочерних процесса, каждый из которых выполняет бесконечный цикл. При этом каждый из дочерних процессов особым образом реагирует на сигнал SIGINT:
- процесс 1 обрабатывает сигнал SIGINT в бесконечном цикле, выдавая свое сообщение на экран, добавляя к нему текущую дату.
Данный цикл защищен от воздействия сигнала SIGQUIT;
- процесс 2 при получении сигнала SIGINT выводит сообщение на
экран и продолжается;
- вся программа процесса 3 защищена от воздействия сигнала SIGINT;
- перед входом процесса 4 в бесконечный цикл для него меняется идентификатор сеанса.
Сразу после порождения дочерних процессов процесс-отец завершается.
Далее следует проверить реакцию оставшихся процессов на сигналы SIGINT и SIGQUIT.
5. Процесс-отец порождает три дочерних процесса, каждый из которых
выполняет бесконечный цикл. При этом каждый из дочерних процессов особым образом реагирует на сигнал SIGINT:
- процесс 1 обрабатывает сигнал SIGINT в бесконечном цикле, выдавая свое сообщение на экран, добавляя к нему текущую дату
Данный цикл защищен от воздействия сигнала SIGQUIT;
- процесс 2 при получении сигнала SIGINT выводит сообщение на экран и продолжается;
- вся программа процесса 3 защищена от воздействия сигнала SIGINT.
Сразу после порождения дочерних процессов процесс-отец завершается.
Далее следует проверить реакцию оставшихся процессов на сигналы SIGINT и SIGQUIT.
6. Процесс-отец открывает существующий текстовый файл, а затем порождает два дочерних процесса, которые по очереди выводят содержимое этого файла фиксированными порциями по 10 символов, предваряя каждый вывод номером своего процесса. Вывод на экран заканчивается или при достижении конца файла, или по истечении интервала времени в 10 секунд.
7. Процесс-отец открывает существующий текстовый файл, а затем порождает два дочерних процесса, которые по очереди выводят содержимое этого файла фиксированными порциями по 20 символов, предваряя каждый вывод номером своего процесса. Вывод на экран заканчивается или при достижении середины файла, или по истечении интервала времени в 10 секунд.
8. Процесс-отец открывает существующий текстовый файл, а затем порождает два дочерних процесса, которые по очереди выводят содержимое этого файла фиксированными порциями по 15 символов, предваряя каждый вывод номером своего процесса. Вывод на экран заканчивается или при достижении середины файла, или по истечении интервала времени в 5 секунд.
9. Процесс-отец открывает существующий текстовый файл, а затем порождает два дочерних процесса, которые по очереди выводят содержимое этого файла фиксированными порциями по 30 символов, предваряя каждый вывод номером своего процесса. Вывод на экран заканчивается или при достижении конца файла, или по истечении интервала времени в 2 секунды.
10. Процесс-отец открывает существующий текстовый файл, а затем порождает два дочерних процесса, которые по очереди выводят содержимое этого файла фиксированными порциями по 22 символа, предваряя каждый вывод номером своего процесса. Вывод на экран заканчивается или при достижении конца файла, или по истечении интервала времени в 12 секунд