Необходимо написать упрощенный командный интерпретатор(shell).
shell должен:
- В бесконечном цикле, как настоящий
shell - Считывать со стандартного ввода программу, которую необходимо запустить, вместе с ее аргументами. Программа задается в виде полного пути до исполняемого файла.
- Выполнять заданную программу с заданными аргументами
- Дожидаться завершения программы и выводить в стандартный поток вывода код ее завершения
- Необходимо обрабатывать ошибки всех используемых системных вызовов
- Необходимо обрабатывать конец вводу со стандартного потока
Необходимо написать подмножество утилиты find.
Программа должна:
- Первым аргументом принимать абсолютный путь, в котором будет производиться поиск файлов
- По-умолчанию выводить в стандартный поток вывода все найденные файлы по этому пути
- Поддерживать аргумент
-inum num. Аргумент задает номер инода - Поддерживать аргумент
-name name. Аргумент задает имя файла - Поддерживать аргумент
-size [-=+]size. Аргумент задает фильтр файлов по размеру(меньше, равен, больше) - Поддерживать аргумент
-nlinks num. Аргумент задает количество hardlink'ов у файлов - Поддерживать аргумент
-exec path. Аргумент задает путь до исполняемого файла, которому в качестве единственного аргумент нужно передать найденный в иерархии файл - Поддерживать комбинацию аргументов. Например хочется найти все файлы с размером больше 1GB и скормить их утилите
/usr/bin/sha1sum. - Выполнять поиск рекурсивно, в том числе во всех вложенных директориях.
Сильные духом призываются к выполнению задания с использованием системного вызова getdents(2). Остальные могут использовать readdir и opendir для чтения содержимого директории.
Кусочек JIT компилятора
Программа должна:
- Выделить память с помощью
mmap(2) - Записать в выделенную память машинный код, соответсвующий какой-либо функции
- Изменить права на выделенную память - чтение и исполнение. See:
mprotect(2) - Вызвать функцию по указателю на выделенную память
- Освободить выделенную память
Что может помочь при выполнении задания?
man mmap(2), munmap(2), mprotect(2)GDB: help disassembleman objdump
Сильные духом призываются к возможности модификации кода выполняемой функции в runtime. Например, вы можете получить аргументом вызова вашей программы какое-то число и пропатчить машинный код этим числом. Эта часть задания будет оцениваться дополнительно в два балла.
Необходимо создать статическую, и две динамических библиотеки и программу, которая будет их использовать.
Помимо этого нужен Makefile, с помощью которого можно будет собрать все части.
-
Статическая библиотека должна:
- Собираться статически
- Предоставлять какие-то функции
-
Первая динамическая библиотека должна:
- Собираться динамически
- Динамически линковаться с программой на этапе линковки
- Предоставлять какие-то функции
-
Вторая динамическая библиотека должна:
- Собираться динамически
- Предоставлять какие-то функции
-
Программа должна
- Статически линковаться с статической библиотекой и вызывать предоставляемые ей функции
- Динамически линковаться с первой динамической библиотекой и вызывать предоставляемые ей функции
- Во время выполнения в явном виде загружать вторую динамическию библиотеку с помощью
dlopen(3)и вызывать какие-то функции из нее
Что может помочь при выполнении задания?
man dlopen(3)man ld(1)man gcc(1)
Необходимо попробовать клиент-серверное взаимодействие через синхронные сокеты.
Помимо этого нужен Makefile, с помощью которого можно будет собрать клиент и сервер.
Семейство протоколов для использования на выбор: AF_UNIX, AF_INET, AF_INET6
-
Сервер должен:
- В качестве аргументов принимать адрес, на котором будет ожидать входящих соединений.
- Стартовать, делать
bind(2)на заданный адрес и ожидать входящих соединений - При получении соединения, выполнять серверную часть придуманного вами протокола
- После обработки принятого соединения возвращаться в режим ожидания входящих соединений
-
Клиент должен:
- Принимать параметром адрес, к которому стоит подключиться
- Выполнять клиентскую часть придуманного вами протокола
- Завершаться
Для сильных духом предлагается выбрать какой-то существующий протокол и имплементировать его, или его разумное подмножество.
Необходимо попробовать клиент-серверное взаимодействие с использованием механизмов мультиплексирования.
Помимо этого нужен Makefile, с помощью которого можно будет собрать клиент и сервер.
Семейство протоколов для использования на выбор: AF_UNIX, AF_INET, AF_INET6
-
Сервер должен:
- В качестве аргументов принимать адрес, на котором будет ожидать входящих соединений.
- Стартовать, делать
bind(2)на заданный адрес и ожидать входящих соединений с использованием одного из механизмов мультиплексирования - При получении соединения, добавлять дескриптор в механизм мультиплексирования и ожидать событий и на нем
- Выполнять на принятых соединениях серверную часть протокола
- По завершении обработки соединения удалять все события из механизмов мультиплексирования
-
Клиент должен:
- Принимать параметром адрес, к которому стоит подключиться
- Используя механизмы мультиплексирования подключаться к серверу
- Используя механизмы мультиплексирования выполнять клиентскую часть протокола
- Завершаться
Для сильных духом предлагается реализовать код, который будет работать на двух разных ОС, используя на каждой специфичные механизмы мультиплексирования
Необходимо получить опыт работы с IPC. Нужно создать приложение клиента и сервера.
Клиент и сервер обшаются через UNIX сокет.
Клиент подключается к серверу через UNIX сокет, получает от сервера файловый дескриптор, соответсвующий объекту какого-либо вида IPC.
Клиент и сервер выполняют какое-то взаимодействие используя IPC
-
Сервер должен:
- Ожидать подключений на
UNIXсокете - Для новых соединений создавать новый вид
IPC, объекты которого представимы в виде файловых дескрипторов - Передавать через
UNIXсокет клиенту файловый дескрипторIPCсоответсвующий клиенту - Ожидать выполнения какого-либо протокола поверх
IPCс клиентом
- Ожидать подключений на
-
Клиент должен:
- Подключиться на
UNIXсокет к серверу - Получать в виде файлового дескриптора клиентскую часть
IPC - Взаимодействовать с сервером через
IPCдля выполнения какого-либо протокола
- Подключиться на
Примерами IPC могут служить: PIPE, socket, файловые дескрипторы для разделямой памяти или сообщений(POSIX), файловые дескрипторы для анонимной памяти
Что может помочь при выполнении задания?
man 7 unix
Необходимо написать обработчик сигнала SIGSEGV. Обработчик должен:
- Дампить значения
general purposeрегистров, соответствуюших моменту падения 2. Дампить память поблизости от адреса, по которому произошло нарушение защиты памяти
Что может помочь при выполнении задания?
man 2 sigactionman 2 getcontext