§ 12. Файловые дескрипторы

Задания

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