Класс для работы с открытым файловым дескриптором

Арсений Смалюк
Арсений Смалюк

В различных языках есть классы, представляющие собой открытый файловый дескриптор.
Это позволяет получать информацию о файле и читать/писать в файл, не открывая его заново. Таким образом можно избавиться от ошибок состояния гонки вокруг файла.

Создать класс (std::file), который хранит внутри себя файловый дескриптор и позволяет получать различные атрибуты открытого файла, например его тип, размер или права доступа.
Для работы с открытым файлом добавить возможность передавать std::file в конструктор fstream или directory_iterator.

10
рейтинг
5 комментариев
Павел Корозевцев
как это будет взаимодействовать с std::filesystem? не проще ли дописать перегрузки уже существующих функций, чем городить отдельный интерфейс?
можно сделать аналог POSIX: есть две функции, одна из которых принимает путь, а другая -- дескриптор.
Павел Корозевцев
Арсений Смалюк
В всех методах и классах std::filesystem, которым достаточно дескриптора, вместе с std::path принимать std::file
"можно сделать аналог POSIX: есть две функции, одна из которых принимает путь, а другая -- дескриптор." - это я и предлагаю.
Арсений Смалюк
yndx-antoshkka
Идея очень хорошая, но требует большой проработки!

Многие ОС используют один тип дескриптора для сокетов/файлов/pipes/памяти/ioctrl - стоит покрыть как можно больший функционал; многие системные вещи уже в С++ обёртках, из которых иногда можно получать низкоуровневые дескрипторы - надо продумать взаимодействия; ОС различаются по функционалу - надо понять как эмулировать недостающий функционал на ОС если его нет и т.д.

Надо продумать как всё должно работать и взаимодействовать друг с другом на разных платформах. Короче говоря - нужен минимальный прототип
yndx-antoshkka
Арсений Смалюк
yndx-antoshkka,
"многие системные вещи уже в С++ обёртках, из которых иногда можно получать низкоуровневые дескрипторы" - это какие, например? Ничего не могу придумать, кроме std::filesystem и fstream.
"из которых иногда можно получать низкоуровневые дескрипторы" - а нужно ли? Если получить fd из fstream, а потом его закрыть, то будет неработающий fstream. В каких случаях может понадобиться получить дескриптор, который уже используется кем-то?
"Многие ОС используют один тип дескриптора для сокетов/файлов/pipes/памяти/ioctrl" - вроде не должно быть проблем, fstream не очень важно, с каким типом дескриптора работать. Можно создать функции для "сырой" работы с дескриптором (write, read, ioctl, seek), которые будут принимать std::file
Арсений Смалюк
yndx-antoshkka
Арсений Смалюк, ок. Нужен прототип
yndx-antoshkka
Павел Корозевцев
Арсений Смалюк, низкоуровневые дескрипторы зачем-то кому-то нужны. из std::thread можно вытащить native_handle(), а умные указатели содержат метод get(). Не стоит лишать возможности получить сырую ручку. Это бывает, например, полезно при поддержании legacy.
"Если получить fd из fstream, а потом его закрыть, то будет неработающий fstream" -- да, так и надо. Ни один разумный человек так делать не должен, но это должно быть возможным.
Павел Корозевцев
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).