Текущий сценарий является epoll_wait по нескольким fds и очереди возможных входящих сообщений, я хотел бы, чтобы цикл ниже epoll_wait был выполнен на событии IO или на новом сообщении.
Путями я знаю:
time
тайм-аут msec и проверка очередь первая вещь в циклеНи одна из точек, отправленных выше, не удовлетворяет меня достаточно, и я задавался вопросом, существуют ли какие-либо другие методы, которые я не нашел.
Причины:
идеи?
Вы можете использовать eventfd, что фактически является тем же самым, что и трюк self-pipe, только с меньшим количеством файловых дескрипторов и меньшим количеством шаблонов (например, в glibc есть удобные функции eventfd_read/write
).
Вы перечислили события, которые могут разбудить epoll, поэтому вопрос действительно таков: «Как мне уменьшить шаблон для трюка self-pipe?»
Ответ на этот вопрос действительно зависит от вашего кода, языка и того, что вы пытаетесь сделать. Я предполагаю, что у вас есть поток, который обрабатывает ввод-вывод, и вы хотите выполнять другую работу в этом потоке, пока нет готового ввода-вывода. В коде, который управляет циклом epoll, он может иметь внутренний дескриптор, который предоставляется другим частям системы как функция «пробуждения» или «отправка работы».
Для этого существуют библиотеки, например boost.asio для C ++. Однако нетрудно написать свой собственный, если вы просто ориентируетесь на epoll, и объем фактического шаблонного кода должен быть минимальным, если у вас есть класс / модуль / все, что связано с циклом epoll.