Что делать с boost.asio и файловым вводом/выводом?

Я заметил, что в boost.asio есть много примеров, связанных с сокетами, последовательными портами и всевозможными нефайловыми примерами. Google на самом деле не нашел для меня много упоминаний о том, является ли asio хорошим или допустимым подходом для выполнения асинхронного ввода-вывода файлов.

У меня есть куча данных, которые я хотел бы записать на диск асинхронно. Это можно сделать с помощью собственного перекрывающегося ввода-вывода в Windows (моя платформа), но я бы предпочел иметь независимое от платформы решение.

мне интересно если

  1. boost.asio имеет любую поддержку файлов
  2. Поддержка файлов boost.asio достаточно развита для повседневного ввода/вывода файлов.
  3. Будет ли когда-нибудь добавлена ​​поддержка файлов? Каковы перспективы этого?

person Doug T.    schedule 18.12.2008    source источник
comment
Общая идея заключается в том, что большую часть времени файлы должны быть доступны для чтения. Где розетки часто расположены за тысячи миль друг от друга и иногда никогда не достраиваются. Если вам нужны асинхронные файлы, обычно это происходит потому, что вы создаете графический интерфейс. Обработайте это, заставив рабочий поток обрабатывать блокирующий файловый ввод-вывод в фоновом режиме.   -  person unixman83    schedule 20.02.2012


Ответы (5)


Поддерживает ли boost.asio какие-либо файлы?

Начиная с (я думаю) Boost 1.36 (который содержит Asio 1.2.0) вы можете использовать [boost::asio::]windows::stream_handle или windows::random_access_handle для переноса HANDLE и выполнения асинхронных методов чтения и записи на нем, которые используйте внутреннюю структуру OVERLAPPED.

Пользователь Lazin также упоминает boost::asio::windows::random_access_handle, который можно использовать для асинхронных операций (например, именованных каналов, а также файлов).

Достаточно ли развита поддержка файлов boost.asio для повседневного ввода/вывода файлов?

Поскольку Boost.Asio сам по себе уже широко используется, а реализация использует перекрывающийся ввод-вывод внутри, я бы сказал да.

Будет ли когда-нибудь добавлена ​​поддержка файлов? Каковы перспективы этого?

Поскольку на веб-сайте Asio нет дорожной карты, я бы сказал, что новых дополнений к Boost.Asio не будет. для этой функции. Хотя всегда есть шанс, что участники добавят код и классы в Boost.Asio. Может быть, вы даже можете сами внести недостающие части! :-)

person vividos    schedule 18.12.2008
comment
Спасибо, это может оказаться полезным. Знаете ли вы о каких-либо планах по реализации независимого от платформы асинхронного файла? - person Doug T.; 18.12.2008
comment
Не то, что я знаю, извините. Существует класс posix::stream_descriptor, который делает то же самое для дескрипторов posix, поэтому можно написать по крайней мере оболочку для двух подходов. - person vividos; 18.12.2008
comment
Я считаю, что posix::stream_descriptor не будет работать с обычными файлами. См. boost.org/doc/libs. /1_43_0/doc/html/boost_asio/обзор/posix/. - person villintehaspam; 17.06.2010
comment
Я также читал это в списке boost.asio.users некоторое время назад; похоже, с Boost.Asio нет способа... thread.gmane .org/gmane.comp.lib.boost.asio.user/4043 - person vividos; 18.06.2010

boost::asio файловый ввод-вывод в Linux

В Linux asio использует механизм epoll для определения готовности дескриптора сокета/файла. для чтения/записи. Если вы попытаетесь использовать vanilla asio для обычного файла в Linux, вы получите исключение «операция не разрешена», потому что epoll не поддерживает обычные файлы в Linux.

Обходной путь заключается в настройке asio для использования механизма select в Linux. Вы можете сделать это, определив BOOST_ASIO_DISABLE_EPOLL. Компромисс здесь заключается в том, что выберите, как правило, медленнее, чем epoll, если вы re работа с большим количеством открытых сокетов. Регулярно открывайте файл с помощью open(), а затем передайте дескриптор файла в boost::asio::posix::stream_descriptor.

boost::asio файловый ввод/вывод в Windows

В Windows вы можете использовать boost::asio::windows::object_handle чтобы обернуть Handle, созданный из операции с файлом. См. пример.

person moof2k    schedule 09.02.2016
comment
Во FreeBSD asio по умолчанию использует kqueue для мультиплексирования системных объектов. - person Slav; 20.11.2016
comment
select не будет делать ничего полезного в соответствии с указанными вами сообщениями об ошибках ничего значимого не возвращается из опроса/выбора файлов файловой системы. и этот комментарий Обычные файлы всегда доступны для чтения и записи. Это четко указано в соответствующих спецификациях POSIX. Я не могу подчеркнуть это достаточно. Помещение обычного файла в неблокирующий АБСОЛЮТНО не имеет никакого эффекта, кроме изменения одного бита в флагах файла. - person Zulan; 27.11.2018

boost::asio::windows::random_access_handle — это самый простой способ сделать это, если вам нужно что-то продвинутое, например асинхронный LockFileEx или что-то еще, вы можете расширить asio, добавить свои собственные асинхронные события. пример

person Evgeny Lazin    schedule 18.12.2008

ASIO поддерживает перекрывающийся ввод-вывод в Windows, где поддержка хороша. В Unix эта идея застопорилась из-за:

  • Файлы часто находятся на одном физическом устройстве, поэтому предпочтительнее обращаться к ним последовательно.
  • Запросы файлов часто выполняются очень быстро, потому что они физически находятся рядом.
  • Файлы часто имеют решающее значение для выполнения основных операций программы (например, перед дальнейшей инициализацией необходимо выполнить чтение файла конфигурации).

Единственным распространенным исключением является передача файлов непосредственно в сокеты. Это настолько распространенный частный случай, что в Linux есть функция ядра, которая обрабатывает это за вас. Опять же, отрицая причину использования асинхронного файлового ввода-вывода.

Вкратце: ASIO, по-видимому, отражает базовую философию проектирования ОС, перекрывающийся ввод-вывод игнорируется большинством разработчиков Unix, поэтому он не поддерживается на этой платформе.

person unixman83    schedule 20.02.2012
comment
Из любопытства, о какой функции ядра вы говорите? - person Riot; 05.06.2013
comment
Неважно, я считаю, что это sendfile, который также может отправлять в сокеты: man7.org/linux/man-pages/man2/sendfile.2.html - person Riot; 05.06.2013
comment
Проблема, которую необходимо решить, заключается в следующем: не выделять стек потоков для каждой ожидающей передачи файла. Как sendfile решает эту проблему? Учитывая, что 99% операций ввода-вывода для веб-сервера будет представлять собой статический контент, регулируемый на стороне клиента, не является ли это довольно большой проблемой? - person Robin Davies; 14.06.2021

В Linux есть библиотека asio, которую использовать для этой работы не сложнее, чем Windows API (я использовал ее). Оба набора операционных систем реализуют одну и ту же концептуальную архитектуру. Они различаются деталями, необходимыми для написания хорошей библиотеки, но не настолько, чтобы у вас не было общего интерфейса для обеих платформ ОС (я использовал один).

По сути, все разновидности асинхронного ввода-вывода файлов следуют архитектуре «Fry Cook». Вот что я имею в виду в контексте операции чтения: я (поток обработки) подхожу к прилавку быстрого питания (ОС) и прошу чизбургер (некоторые данные). Он дает мне копию билета моего заказа (некоторая структура данных) и выдает билет повару (ядро и файловая система) для приготовления моего гамбургера. Затем я сажусь или читаю в телефоне (занимаюсь другой работой). Позже кто-то объявляет, что мой бургер готов (сигнал потоку обработки), и я собираю свою еду (буфер чтения).

person Zack Yezek    schedule 04.10.2013
comment
И кто именно готовит на веб-сервере LINUX asio? - person Robin Davies; 14.06.2021