- У каждого студента есть свой
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
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
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)