/os-homeworks

ITMO2015 OS course homeworks

Primary LanguageC

Формат сдачи заданий

  • У каждого студента есть свой git или hg репозиторий, в котором будет вестись работа над домашними заданиями. Зарегистрировать репозиторий можно по ссылке http://goo.gl/forms/JOlo6v5qO2.
  • Задания сдаются коммитами в этот репозиторий. Формат каждого задания оговаривается отдельно в его формулировке.
  • Если вам кажется, что вы видите в формулировке задании какую-то неоднозначность или другую проблему, об этом желательно спросить.
  • Мы постараемся прикрутить (в тех заданиях, где это возможно) частично автоматизированную проверку.
  • Задание считается принятым на проверку, если оно было до дедлайна залито в репозиторий и прошло автоматическую проверку (если она уже допилена), или просто залито в репозиторий до дедлайна (если автоматическая проверка ещё не допилена). Стоит заметить, что задание вряд ли пройдёт автоматическую проверку при несоблюдении требований, описанных ниже.
  • Принятое на проверку задание нужно защитить на паре. Необходимое условие для защиты — понимание происходящего в написанном коде.

Требования к домашним заданиям

  • Если не указано обратное, задания нужно писать на языке C.
  • Ошибки во время выполнения программы не должны игнорироваться.
  • В репозитории не должно быть бинарников: они должны получаться в результате запуска скриптов сборки.
  • Ожидается, что выполнение make в корне вашего репозитория приведёт к генерации всех требуемых бинарников.
  • В силе все пункты раздела Homeworks из http://oxij.org/activity/itmo/general/, кроме первых двух.

Задание первое

В первом задании необходимо реализовать примитивный вариант утилиты cat, копирующий символы из stdin на stdout.

Первая часть

Требуется реализовать динамическую библиотеку, содержащую функции-хелперы read_ и write_, делающие то же, что и read и write, но для буфера целиком (либо до EOF). Сигнатуры хелперов должны совпадать с сигнатурами оригинальных функций.

Файлы в репозитории

  • /lib/helpers.h
  • /lib/helpers.c
  • /lib/Makefile

Скриптом сборки генерируется

  • /lib/libhelpers.so

Hints

  • man 2 read
  • man 2 write

Вторая часть

Используя функции-хелперы из первой части, реализовать утилиту cat. В качестве аргумента fd хелперам read_ и write_ необходимо передавать STDIN_FILENO и STDOUT_FILENO соответственно.

Файлы в репозитории

  • /cat/cat.c
  • /cat/Makefile

Скриптом сборки генерируется

  • /cat/cat

Пример работы

  • ./cat < cat.c > cat2.c && diff cat.c cat2.c && echo OK

Дедлайн

  • 11 марта, 06:00 (GMT+3)

Задание второе

Требуется реализовать утилиту revwords, читающую слова из stdin и выводящую в stdout эти же слова развёрнутыми. Гарантируется, что каждое слово имеет длину не более 4096 байт.

Первая часть

Добавить в библиотеку функцию read_until, имеющую следующую сигнатуру:

ssize_t read_until(int fd, void * buf, size_t count, char delimiter);

Функция имеет ту же семантику, что и read_ из первого задания, с одним отличием: она прекращает считывание из fd не только при заполнении буфера, но и при наличии символа delimiter в уже заполенной части буфера.

Файлы в репозитории

  • /lib/helpers.h
  • /lib/helpers.c
  • /lib/Makefile

Скриптом сборки генерируется

  • /lib/libhelpers.so

Вторая часть

Используя функции из библиотеки, реализовать требуемую утилиту. Если в буфере есть слово, которое может быть выведено на stdout, утилита не должна ожидать данных из stdin.

Слова отделяются друг от друга пробелом. Все прочие символы, в том числе \n и \t, считаются буквой.

Файлы в репозитории

  • /revwords/revwords.c
  • /revwords/Makefile

Скриптом сборки генерируется

  • /revwords/revwords

Пример использования

Команда (echo -ne "abc def\ngh" ; sleep 3; echo -ne " qwer") | ./revwords должна вести себя следующим образом: вывести cba␣, три секунды ничего не делать, вывести hg\nfed␣rewq, где знаком обозначается пробел.

Дедлайн

  • 18 марта, 06:00 (GMT+3)

Задание третье

Реализовать утилиту filter, читающую строки из stdin, передающую эти строки как последний аргумент команде, указанной в argv, и выводящую только те из них, на которых команда завершилась с нулевым кодом возврата.

Часть первая

Добавить в библиотеку следующую функцию:

int spawn(const char * file, char * const argv [])

Функция должна запускать исполняемый файл file, выбираемый в соответствии с переменной окружения PATH, с аргументами, задаваемыми в argv, дожидаться её завершения и возвращать её код возврата.

Например, если специально не предпринимать против этого мер, следующий код

char* args[] = {"ls", "/bin", NULL};
int res = spawn("ls", args);

должен показывать содержимое директории /bin и возвращать res = 0.

Файлы в репозитории

  • /lib/helpers.h
  • /lib/helpers.c
  • /lib/Makefile

Скриптом сборки генерируется

  • /lib/libhelpers.so

Hints

  • man 2 fork
  • man 3 exec
  • man 2 wait

Запрещается использовать

  • man 3 system

Часть вторая

Используя библиотеку, реализовать требуемую утилиту.

Строки отделяются друг от друга \n.

Файлы в репозитории

  • /filter/filter.h
  • /filter/filter.c
  • /filter/Makefile

Скриптом сборки генерируется

  • /filter/filter

Пример использования

  • Вызов echo -ne "/bin/sh\n/blablabla\n/bin/cat\n" | ./filter tar cf /tmp/filter.tar должен вывести /bin/sh и /bin/cat.

Дедлайн

  • 25 марта, 06:00 (GMT+3)