Программа лекций и презентации по курсу "ОС UNIX"

Часть 1: Основы

Часть 2: Разработка ПО в UNIX

Задания для лабораторных работ

Лабораторная работа 1

Требуется написать скрипт, совместимый с POSIX Shell, который производит сборку некоторого исходного файла. Таким файлом может быть как программа на языке C/C++, так и страница TeX. Скрипт должен:

  1. Возвращать информативный код ошибки (скажем, если исходный файл вообще невозможно откомпилировать).
  2. Анализировать текст и находить заготовленный комментарий с именем конечного файла. Комментарий должен быть некоторым ключевым словом, наиболее логично использовать, скажем, "Output:".
  3. Сборка должна производиться в временном каталоге, который должен быть создан при помощи утилиты mktemp.
  4. Каталог должен быть удалён при любом исходе работы скрипта, включая обработку сигналов, которые требует немедленного прекращения работы.
  5. Рядом с исходным файлом после завершения работы должен появиться конечный файл с именем, как в распознанном комментарии. Все попутные файлы компиляции должны быть удалены вместе со временным каталогом (что очевидно, потому что они не должны покидать пределы временного каталога).

Лабораторная работа 2

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

Лабораторная работа 3

Требуется подготовить безопасную реализацию серверного процесса, который совмещает обработку соединений TCP/IP с обработкой сигналов (можно выбрать, скажем, сигнал SIGHUP). Приложение должно:

  1. Принимать соединения на некоторый порт, сообщать о новых соединениях на терминал, одно соединение оставлять принятым, остальные закрывать сразу после подключения.
  2. При появлении любых данных в соединении выводить сообщение на терминал (для простоты достаточно вывести только количество полученных данных).
  3. При получении сигнала выводить сообщение на терминал. Фактически, работа сводится к правильному вызову функции pselect(), но все действия должны быть выполнены в предельно безопасном виде, исключающем любые race condition.

Лабораторная работа 4

Требуется подготовить программу на C/C++ в традициях "Hello, world!", которая должна собираться комплектом automake/autoconf. Другими словами, в ходе работы нужно, чтобы были правильно составлены файлы hello.c, configure.in, automake.am позволяющие получить дистрибутив программы. Полученный дистрибутив должен собираться командой:

./configure && make
        

Лабораторная работа 5

Требуется подготовить контейнер Docker, содержащий любой HTTP-сервер, который при запуске открывает порт 80 и умеет отсылать index.html, содержащий текст "Куда мы без UNIX?".

Инструкция по сборке лабораторных при помощи Docker в Microsoft Windows

Лабораторные работы можно выполнять в Microsoft Windows при помощи Docker. Его дистрибутив можно найти по этой ссылке.

В качестве примера здесь можно найти программу для языка C с приложенным Dockerfile. Чтобы скомпилировать и запустить программу, нужно в папке с проектом выполнить две команды:

  1. docker build -t unix-lab .
  2. docker run unix-lab

В университетском Moodle доступен видеоролик, как это выполняется.

С помощью докера можно запускать bash-скрипты следующей командой:

docker run -it --rm -v //d/path/to/script.sh:/script.sh bash:4.4 bash /script.sh
        

Где //d/path/to/script.sh - путь к баш-скрипту где-то на диске D. К сожалению, не нашёл официального контейнера для чистого shell, но bash ведь тоже подойдёт?