Revising «Как вы используете AIO и EPOLL вместе»
Вопрос
После обсуждения в Как вы используете AiO и Epoll вместе в одном контуре событий?.
В Linux есть 2 "Aio" API в Linux. Есть POSIX AIO (семейство функций AIO_ *), включенная в Glibc и Libaio, я верю по Redhat (?), Семья IO_ *.
Первый допускает регистрацию запросов уведомлений через член AIO_SIGEVENT AIOCB. Это можно легко интегрировать с петлями PPOLL () / PSELECT (). Если вы хотите интегрировать POSIX AiO с EPOLL (), то вам нужно перевести сигнал в событие на фиктивной FD (может быть, может быть) и прослушать его с помощью epoll, при прохождении сигнала либо классическим образом, либо с PPOLL / Выбрать. Насколько безопасным является первым выбором (обычными Sighandlers), зависит от применения. И, возможно, на EPOLL, но я не полностью осознаю его внутренних органов. Могу ли я благополучно предположить, что если у меня есть приложение EPoll на основе, и я хочу добавить поддержку POSIX AIO, то я прикручен? Это был мой вопрос.
Вторая реализация Aio, libaio - может быть использована действительно с EventFD () (struct iocb, имеющая элемент AIO_RESFD, который, как ожидается, будет нулевым или EventFD для доставки результатов AIO). Но это не по книге. POSIX-указанный, то есть.
Я мечтаю о себе быть * пользователем BSD, где все ясно. У вас есть поддержка POSIX AIO и KQueue () для событий Aio. Кристально чистый. Как много других вещей.
Решение
Примечание. Вы можете использовать Posix Aio с Epoll, есть signalfd(2)
Он создает дескриптор файла, который вы можете использовать для уведомления сигналов в контуре на основе EPoll.
Также вторым AIO API должен в конечном итоге, в конечном итоге, на каком Glibc Base это реализация POSIX AIO, он еще не совсем там ... (Я не знаю, только ли кто-то работает над этим)