§ 12. Файловые дескрипторы
Задания
- Напишите класс
File_descriptor, который является оберткой для файловых дескрипторов Linux. В классе должны быть реализованы следующие методы.open(обертка дляopen);close(обертка дляclose);read(обертка дляread);write(обертка дляwrite);- конструктор по умолчанию;
- деструктор, который автоматически закрывает валидный файловый дескриптор;
operator=с перемещением и копированием;- конструктор с перемещением и копированием (копирование реализуется с помощью
dup).
check)! - Напишите модульный тест, в котором проверяется корректность работы класса. Для этого создайте
std::vector<File_descriptor>и добавьте в него 10 файловых дескрипторов, которые заранее были открыты и связаны с разными файлами. После этого запишите в каждый файл индекс файлового декриптора в контейнере (порядковый номер) и закройте. - Проверьте корректность работы программы с помощью санитайзера. Для этого соберите проект с флагом
-Db_sanitize=addressи запустите тесты:meson configure -Db_sanitize=address ninja test meson configure -Db_sanitize=none # отключение санитайзера
- Проверьте корректность работы программы с помощью
valgrind. Для этого запустите тесты следующим образом.# отключаем санитайзер meson configure -Db_sanitize=none # оборачиваем команду запуска каждого теста с помщью valgrind # с набором флагов, которые нужны для отслеживания # файловых дескрипторов meson --verbose --wrap="valgrind --track-fds=yes" test
Если ваша программа корректна, тоvalgrindвыведет, что «утекли» только стандартные файловые дескрипторы 0, 1, 2. Meson выведет, что тест завершился корректно, даже если какие-то файловые дескрипторы не были закрыты. Это ограничение используемых нами инструментов.