Пересматривая "Как вы используете AIO и EPOLL вместе" - PullRequest
11 голосов
/ 01 февраля 2010

после обсуждения на Как вы используете AIO и epoll вместе в одном цикле событий? .

На самом деле в Linux есть 2 "aio" API. Есть POSIX aio (семейство функций aio_ *), включенное в glibc и libaio, разработанные, как мне кажется, RedHat (?), Семейство io_ *.

Первый позволяет регистрировать запросы на уведомления через aio_sigevent aiocb. Это может быть легко интегрировано с циклами событий ppoll () / pselect (). Если вы хотите интегрировать POSIX aio с epoll (), вам нужно преобразовать сигнал в событие на фиктивном fd (возможно, в трубу) и прослушать его с помощью epoll, перехватывая сигнал либо классическим способом, либо с помощью ppoll / Выбрать. Насколько безопасен первый выбор (нормальные сигилдеры), зависит от применения. И, возможно, на epoll, но я не до конца осведомлен о его внутренностях. Могу ли я с уверенностью предположить, что если у меня есть приложение на основе epoll и я хочу добавить поддержку POSIX aio, то я облажался? Это был мой вопрос.

Вторая реализация AIO, libaio, может действительно использоваться с eventfd () (struct iocb, имеющая член aio_resfd, который, как ожидается, будет нулевым, или eventfd для доставки результатов AIO). Но это не по книге. Указанный POSIX, то есть.

Я мечтаю о себе как о пользователе * BSD, где все ясно. У вас есть поддержка POSIX AIO и kqueue () для событий AIO. Кристально чистый. Как и многие другие вещи.

1 Ответ

6 голосов
/ 22 октября 2010

обратите внимание, что вы МОЖЕТЕ использовать POSIX aio с epoll, есть signalfd(2), он создает файловый дескриптор, который затем можно использовать для уведомления о сигналах в цикле на основе epoll.

Кроме того, второй API aio должен в конечном итоге быть тем, на чем основывается glibc, это реализация POSIX aio, просто его пока нет ... (Я не знаю, работает ли кто-нибудь над ним)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...