Программа лекций и презентации по курсу "ОС 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.