Практические задания по курсу "Операционные системы" ==================================================== 1. Программирование на языке оболочки 2. Работа с файлами и каталогами 3. Процессы, сигналы и взаимодействие процессов 4. Многопоточное программирование 1. Программирование на языке оболочки ------------------------------------- Все скрипты должны выдавать справку о своем назначении и поддерживаемых параметрах командной строки. Справка печатается на экран, если среди параметров есть ключ «--help» или «-h», никаких других действий в этом случае выполнять не нужно. 1.1. [1] Напишите скрипт, архивирующий все файлы в домашнем каталоге пользователя, размер которых больше 100K и к которым не обращались больше 30 дней. Предусмотрите возможность изменения параметров (размера и времени обращения) с помощью параметров командной строки. 1.2. [1] Напишите скрипт, рассылающий пользователям системы ежедневное сообщение администратора (оно хранится в файле /etc/motd). Скрипт должен считать список пользователей из файла, имя которого указывается в командной строке (по умолчанию следует использовать файл mailinglist в домашнем каталоге пользователя) и отправить этим пользователям содержимое файла /etc/motd по почте (используйте команду mail). 1.3. [1] Напишите скрипт, позволяющий найти в указанных каталогах все файлы размером больше заданного (по умолчанию – 1 мегабайт) и вывести пути к таким файлам, их размер и владельца. По умолчанию скрипт должен просматривать домашний каталог пользователя. 1.4. [1] Напишите скрипт, автоматически распаковывающий архивы. Скрипт должен определять тип архива (tar, gz, bzip2, tar.gz, tar.bzip2) по имени файла и вызывать нужные архиваторы. Имена архивов передаются в командной строке. Предусмотрите возможность явного указания типа архива в командной строке для случая, если имя файла не соответствует используемому архиватору. Используйте программы tar, gunzip, bunzip2. 1.5. [1] Напишите скрипт, архивирующий домашний каталог пользователя в двух режимах: в режиме полной архивации и в режиме инкрементальной архивации (в этом случае в архив должны добавляться только те файлы, которые изменились с момента предыдущей архивации). 1.6. [1] Напишите скрипт, управляющий списком текущих дел. Скрипт должен хранить список дел в файле .todo в текущем каталоге и предоставлять возможность добавления задачи, удаления задачи, отметки задачи как выполненной и просмотра всех задач. Режим работы задается параметром командной строки. Предусмотрите также параметр, при использовании которого скрипт будет работать с файлом .todo в домашнем каталоге пользователя независимо от наличия файла .todo в текущем каталоге. 1.7. [1] Напишите скрипт, отыскивающий в каталоге все файлы, не принадлежащие указанному пользователю, и выводящий список таких файлов (включая путь к ним), сведения о владельце и группе таких файлов, а также правах доступа для них. По умолчанию скрипт должен отыскивать файлы, не принадлежащие запускающему скрипт пользователю и находящиеся в его домашнем каталоге. 1.8. [2] Напишите скрипт (аналог команды killall), позволяющий послать сигнал всем процессам с указанными именами. Номер сигнала должен передаваться первым аргументом (с предшествующим знаком «-»), остальные аргументы – имена процессов. По умолчанию нужно посылать сигнал SIGTERM. Например: killall.sh -9 top xterm 1.9. [2] Напишите скрипт, сравнивающий два дерева каталогов. Скрипт должен выводить сведения о файлах и каталогах, которые отсутствуют в одном дереве каталогов, но присутствуют в другом, а также об отличающихся файлах. Для сравнения файлов можно использовать команды cmp или diff. 1.10. [2] Напишите скрипт, отыскивающий дублирующиеся файлы в домашнем каталоге пользователя или в каталогах, указанных в качестве параметров командной строки. Дублирование файлов можно, в частности, проверить по совпадению имени и контрольной суммы MD5 (используйте команду md5sum). 2. Работа с файлами и каталогами -------------------------------- 2.1. [1] Напишите программу, вычисляющую суммарный размер всех файлов в указанном каталоге и его подкаталогах. 2.2. [1] Напишите программу, читающую данные со стандартного ввода и выводящую их одновременно на стандартное устройство вывода и во все указанные в качестве аргументов файлы (аналог программы tee). 2.3. [1] Напишите программу, подсчитывающую количество строк, слов и символов в файле (аналог программы wc). 2.4. [1] Напишите программу, выводящую на стандартное устройство вывода последние N строчек, прочитанных из файла или со стандартного ввода (значение N задается в командной строке, по умолчанию N = 20) — аналог команды tail. 2.5. [1] Напишите программу, которая печатает на стандартное устройство вывода последние 10 строк файла и все строки, которые добавляются в конец файла впоследствии (аналог tail -f). 2.6. [1] Напишите простой архиватор (программу, объединяющую несколько файлов в один), сохраняющий атрибуты файла (владельца, группу, права доступа, дату последнего изменения) и восстанавливающий их при распаковке архива. 2.7. [1] Напишите программу копирования файлов (аналог программы cp), которая при копировании файлов с «дырками» не заполняет «дырки» нулевыми байтами. 3. Процессы, сигналы и взаимодействие процессов --------------------------------------------------- 3.1. [1] Напишите программу, допускающую одновременную работу не более трех своих экземпляров. Программа должна работать достаточно долго для того, чтобы можно было убедиться в том, что более трех копий в системе не работают (можно использовать sleep). 3.2. [1] Напишите две программы, которые работают попеременно: если первая программа уже запущена в тот момент, когда запускается вторая, то первая программа завершается, и наоборот. 3.3. [1] Напишите программу, которая запускает указанную в качестве аргумента программу и перезапускает ее в случае аварийного завершения (код завершения не равен 0). 3.4. [2] Напишите программу-демон, получающую в качестве аргумента число N и через N минут после запуска отправляющую пользователю, от чьего имени она запущена, письмо с произвольным текстом (запустите программу mail). 3.5. [2] Напишите простой интерпретатор команд, поддерживающий перенаправление ввода-вывода в файл и из файла. 3.6. [2] Напишите простой интерпретатор команд, поддерживающий перенаправление стандартного вывода программы на стандартный ввод другой программы (аналог канала "|" в bash). 3.7. [3] Постройте модель регулируемого перекрестка, представив каждый из двух светофоров отдельным процессом. В нормальном состоянии светофор, разрешающий движение по Большому проспекту, горит зеленым светом, а светофор, разрешающий движение по Поперечной улице - красным. При нажатии ^C светофор Большого проспекта меняет свет с зеленого на желтый. Через 5 секунд светофор Большого проспекта переключается на красный свет, а светофор Поперечной улицы - с красного на зеленый. Проходит 20 секунд. Светофор Поперечной улицы переключается на желтый. Еще через 5 секунд светофор Поперечной улицы загорается красным, а светофор Большого проспекта переключается с красного на зеленый. Перед следующим переключением светофора на Большом проспекте должно пройти не меньше 20 секунд. После нажатия ^C все последующие нажатия этих клавиш в течение цикла переключения светофоров игнорируются. 3.8. [3] Напишите простой интерпретатор команд, поддерживающий запуск программ в фоновом режиме. 3.9. [3] Реализуйте клиент-серверную СУБД. Программа-сервер хранит в файле записи фиксированной длины и поддерживает следующие операции: - добавление записи, - удаление записи - выборка записей по указанному ключу. Программа-клиент обеспечивает интерфейс пользователя для работы с записями. Клиент и сервер выполняются на одном компьютере и взаимодействуют через именованные каналы или сокет Unix. 3.10. [3] Решите задачу 3.9, реализовав сервер в виде демона. 4. Многопоточное программирование --------------------------------- Описание задач из этого раздела и подходов к их решению можно найти в книге Э.Таненбаум, А.Вудхалл, «Операционные системы: разработка и реализация», СПб.: Питер, 2005 и других. Задачи необходимо решить с использованием потоков POSIX. 4.1. Напишите программу, моделирующую решение задачи "обедающих философов". 4.2. Напишите программу, моделирующую решение задачи читателей и писателей в условиях, когда разрешено одновременное чтение данных, а запись требует монопольного доступа. 4.3. Напишите программу, моделирующую решение задачи «спящего брадобрея».