В первом задании необходимо реализовать примитивный вариант утилиты cat, копирующий символы из stdin на stdout.
Требуется реализовать динамическую библиотеку, содержащую функции-хелперы read_ и write_, делающие то же, что и read и write, но для буфера целиком (либо до EOF). Сигнатуры хелперов должны совпадать с сигнатурами оригинальных функций.
/lib/helpers.h/lib/helpers.c/lib/Makefile
/lib/libhelpers.so
man 2 readman 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 forkman 3 execman 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)