§ 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 выведет, что тест завершился корректно, даже если какие-то файловые дескрипторы не были закрыты. Это ограничение используемых нами инструментов.