В данном разделе представлены задачи, последовательно выполняя которые вы познакомитесь с основными концепциями операционных систем и напишите свой кеширующий HTTP-прокси!
Папка tasks содержит задачи, каждая из которых описана в файле labN.md. Задачи выполняются по мере увеличения номера N.
Каждый из этих файлов содержит набор теоретических вопросов к лабе, само задание, а также набор требований (включая интерфейсы), которым написанный вами код должен соответствовать. Все требования включаются друг в друга. Это означает, что требования к лабе 1 актуальны и для всех последующих лаб.
- Код оформлен в едином стиле:
- однообразное именование функций, типов, переменных, макросов и т.д. (при этом допускается, что для каждого из этих объектов стиль именования свой);
- однообразные отступы;
- однообразная расстановка скобок;
- и т.д..
- Проверены возвращаемые значения функций и системных вызовов и
предусмотрена адекватная реакция на ошибки. Можно не проверять на
возвращаемое значение функцию
printf(). - Сборка проекта должна производиться с помощью Makefile'ов
- При сборке кода не должно возникать ошибок и предупреждений (используйте
-Wall -Wextra -Werror). - Все ошибки в коде должны быть обработаны.
- При корректной работе программа должна завершаться с кодом возврата 0.
- Все ресурсы выделенные явно, должны быть также явно освобождены. Не должно быть точек выхода из программы, где не освобождаются явно выделенные ресурсы.
- Склонируйте репозиторий тестов. Внимательно ознакомьтесь с README.md системы тестирования.
- Установите
python3,pipи все необходимые зависимости командойpip install -r requirements.txt. - Запустите тесты командой
Примеры:
./run_tests.py --src <путь до корневой директории вашего проекта>./run_tests.py --src /home/student/proxy ./run_tests.py --src ~/proxy ./run_tests.py --src ../../proxy - При тестировании вы можете посмотреть описания всех тестов, увидеть какие были непройдены и почему.
Тестовая система может сообщать о том, что при работе прокси был сгенерирован core dump (корка).
Для этого нужно, чтобы был установлен gdb и ваша система могла генерировать корки.
На линуксе это достигается следующим способом:
- Проверьте, установлен ли шаблон:
cat /proc/sys/kernel/core_pattern.- Если он начинается с символа
|, то в вашей системе корки обрабатывает стороннее приложение. В этом случае тестовая система не сможет сообщать о корках. Вы можете сохранить текущее значениеcore_pattern, обновить на требуемое для тестирования, а потом вернуть обратно.
- Если он начинается с символа
- Установить шаблон можно так:
sudo sysctl -w kernel.core_pattern='core-%e.%p'или просто записав нужное значение в/proc/sys/kernel/core_patternс правами администратора; - Лимит на размер дампа ядра должен быть не 0. Для этого:
- Проверьте ограничение на размер корки командой
ulimit -c unlimited; - Замените его, если он равен нулю, командой
ulimit -c unlimited(вместо unlimited можно число).
- Проверьте ограничение на размер корки командой
- Теперь при аварийном останове будут генерироваться дампы ядра, которые помогут вам при отлаживании.
Файлы с корками будут лежать в той директории, в которой был вызван исполняемый файл
(в случае шаблона
core-%e.%p).
Если все настроено корректно, то тесты смогут ловить корки и выводить стектрейсы возникших падений.
Для дебага дампа нужно запустить gdb следующим образом:
gdb <путь до исполняемого файла> <путь до дампа ядра>
Получить стектрейс, который привел к падению, можно командой bt или bt full.
Если вы нашли ошибки, неточности или противоречия в условиях задач или тестов, то будем рады, если вы сообщите о них. Также можете создавать пул реквесты для исправлений в репозиториях заданий и тестов.