Какова сделка с boost.asio и файлом ввода/вывода?
Я заметил, что в boost.asio есть много примеров, связанных сокетов, последовательных портов и всех видов нефайловых примеров. Google действительно не очень много для меня, что упоминает, что asio - хороший или действительный подход для выполнения асинхронного ввода-вывода файла.
У меня есть gobs данных, которые я бы хотел записать на диск асинхронно. Это можно сделать с наложенным наложением io в Windows (моя платформа), но я предпочел бы иметь независимое от платформы решение.
Мне любопытно, если
- boost.asio поддерживает любые типы файлов
- Поддержка файла boost.asio достаточно зрелая для ежедневного ввода/вывода файлов
- Будет ли добавлена поддержка файлов? Каковы перспективы для этого?
Ответы
Ответ 1
Поддерживает ли boost.asio любую поддержку файлов?
Начиная с (я думаю) Boost 1.36 (который содержит Asio 1.2.0), вы можете использовать [boost:: asio::] windows:: stream_handle или windows:: random_access_handle, чтобы обернуть РУЧКУ и выполнить асинхронные методы чтения и записи на нем, которые используют внутреннюю структуру OVERLAPPED.
Пользователь Lazin также упоминает boost:: asio:: windows:: random_access_handle, который можно использовать для асинхронных операций (например, именованных каналов, а также файлов).
Поддерживается ли поддержка файла boost.asio достаточно зрелой для ежедневного ввода файлов?
Поскольку Boost.Asio сам по себе широко используется к настоящему времени, и реализация использует перекрытие IO внутри, я бы сказал, да.
Будет ли добавлена поддержка файлов? Каковы перспективы этого?
Поскольку на Asio нет дорожной карты, я бы сказал, что новых обновлений Boost для Novost не будет. особенность. Хотя всегда есть шанс, что вкладчики добавят код и классы в Boost.Asio. Возможно, вы даже можете внести недостающие части самостоятельно!: -)
Ответ 2
boost:: asio file i/o в Linux
В Linux asio использует механизм epoll
, чтобы определить, готов ли дескриптор сокета/файла к чтению/записи. Если вы попытаетесь использовать vanilla asio в обычном файле в Linux, вы получите исключение "операция не разрешена", потому что epoll не поддерживает обычные файлы в Linux.
Обходной путь заключается в настройке asio для использования механизма select
в Linux. Вы можете сделать это, указав BOOST_ASIO_DISABLE_EPOLL
. Компромисс здесь как правило, медленнее epoll, если вы работаете с большим количеством открытых сокетов. Регулярно открывайте файл, используя open()
, а затем передайте дескриптор файла boost::asio::posix::stream_descriptor
.
boost:: asio file i/o в Windows
В Windows вы можете использовать boost::asio::windows::object_handle
, чтобы обернуть Handle
, который был создан из файловой операции. См. пример.
Ответ 3
boost:: asio:: windows:: random_access_handle - это самый простой способ сделать это, если вам нужно что-то продвинутое, например асинхронное LockFileEx или что-то еще, вы можете расширить asio, добавить свои собственные асинхронные события. пример
Ответ 4
ASIO поддерживает перекрывающиеся операции ввода-вывода в Windows, где поддерживается поддержка. В Unixes эта идея застопорилась из-за:
- Файлы часто расположены на одном физическом устройстве, предпочтительнее получить доступ к ним.
- Запросы файлов часто завершаются очень быстро, потому что они физически близки.
- Файлы часто имеют решающее значение для завершения основной работы программы (например, чтение в файле конфигурации должно выполняться до инициализации)
Единственное общее исключение - это подавать файлы непосредственно в сокеты. Это такой общий особый случай, что Linux имеет функцию ядра, которая обрабатывает это для вас. Опять же, отрицание причины использования асинхронного ввода-вывода файлов.
Вкратце: ASIO, по-видимому, отражает основную концепцию проектирования ОС, перекрытие ввода-вывода игнорируется большинством разработчиков Unix, поэтому оно не поддерживается на этой платформе.
Ответ 5
В Linux есть библиотека asio, которая не сложнее использовать, чем Windows API для этой работы (я ее использовал). Оба набора операционных систем реализуют одну и ту же концептуальную архитектуру. Они отличаются деталями, которые имеют отношение к написанию хорошей библиотеки, но не до такой степени, что у вас не может быть общего интерфейса для обеих платформ ОС (я использовал один).
В принципе, все вкусы ввода-вывода файлов Async следуют архитектуре "Fry Cook". Здесь, что я имею в виду в контексте Read op: я (поток обработки), подходите к счетчику быстрого питания (OS) и просите чизбургер (некоторые данные). Это дает мне копию моего заказа (какая-то структура данных) и выдает билет в спину к повару (ядро и файловая система), чтобы приготовить мой гамбургер. Затем я сажусь или читаю свой телефон (делаю другую работу). Позже кто-то объявляет, что мой гамбургер готов (сигнал обрабатывающей нити), и я собираю пищу (буфер чтения).