LINUX.ORG.RU

epoll есть пару вопросов (+)


0

0

задумал я переписать одну подсистему с select на epoll
с целью увеличения производительности
возник такой вопрос что возвращает epoll_wait и как это использовать ?
по ману он возвращает количество дескрипторов требующих обработки
int epoll_wait(int epfd, struct epoll_event * events,
int maxevents, int timeout);

но тут для меня ряд непоняток
struct epoll_event * events,
сюда мы передаем как я понимаю массив чистых структур
и epoll_wait заполняет их данными по активным дескрипторам или как ?

а также, если у меня например есть некий объект
связанный с дескриптором есть ли какой-то способ
к примеру в структуру struct epoll_event
запихнуть на него указатель, передать в ядро через epoll_ctl
и чтобы потом epoll_wait возвращал мне дескриптор + где-то
этот мой указатель ?

иначе, если это не возможно
получаеться все равно мутная схема,
получил дескриптор и события через epoll_wait
по дескриптору нашел соответствующий объект,
обработал события......
и в общем-то каждый раз искать объект это
совсем нерационально, я понимаю что можно
сделать быстрые схемы типа хэша или массива
с индексом по дескриптору но это все равно костыли :)

anonymous

Сам же всё и описал. Когда добавляешь дескриптор через epol_ctl (..., EPOLL_CTL_ADD, ...), передаёшь туда указатель на struct epoll_event, в этой структуре есть поле 'data' - это union (описание - в /usr/include/sys/epoll.h), туда и кладёшь свой указатель. Потом epoll_wait будет этот указатель возвращать в массиве epoll_event'ов.

erDiZz
()
Ответ на: комментарий от erDiZz

спасибо теперь понял
меня почему-то смутило что в этой структуре
union содержит поле fd и я предположил что оно
должно быть равно тому дескриптору что я передаю на обработку
через epoll_ctl
а как я понял исходя из ваших слов это чисто юзерские данные
и я могу туда пихать все что мне надо в том числе и указатель...
ядро просто после epoll_wait скопирует эти данные
не модифицируя их, в результате у меня, исходя из определения
этого обединения, есть 8 байт которые я пользую в своих нуждах

спасибо еще раз, теперь все прозрачнее стало ;)

anonymous
()
Ответ на: комментарий от anonymous

Может посмотреть сорцы libevent ? или его использовать? =)

OxiD ★★★★
()

переписывать лучше не на epoll, а на boost::asio или libevent, чтобы проблем с переносимостью не было

Reset ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.