Обсуждение статьи тематического каталога: Создание сервера для обработки событий с использованием epoll (epoll linux select gcc)Ссылка на текст статьи: http://www.opennet.me/base/dev/epoll_intro.txt.html
хотелось бы комментарии на русском, легче было бы читать
К моменту написания данного текста доступна (во всех смыслах) информация типа man epoll. Она включает в себя пример кода (более удобоваримый) и что-то вроде faq, "там все прекрасно описано"(цитата). Вместо солидного куска кода (зачем? каждая лишняя строка уменьшает кол-во дочитавших до конца) Было бы интересней сравнить poll, ppoll,epoll,select,pselect,... Ну, то есть тем,кому лень Стивенсов и маны читать.
У Стивенса нет информации по epoll, хотя все остальные вызовы довольно неплохо описаны. Код и описание на нормальном уровне, а вот вопрос своевременности... И еще момент: может сейчас лучше использовать libevent вместо низкоуровневых системных вызовов? И с переносимостью дела будут лучше обстоять.
>У Стивенса нет информации по epoll, хотя все остальные вызовы довольно неплохо
>описаны. Код и описание на нормальном уровне, а вот вопрос
>своевременности... И еще момент: может сейчас лучше использовать libevent вместо низкоуровневых
>системных вызовов? И с переносимостью дела будут лучше обстоять.Точно, надо было сразу на libevent писать, как то не сообразил, перепишу как только освобожусь, а эту версию можно оставить для истории. ;-)
При закрытии соединения клиент не удаляется из epoll'а.
В документации (http://linux.die.net/man/4/epoll) написано что при закрытии дескриптора, он автоматически удаляется из epoll.QUESTIONS AND ANSWERS (from linux-kernel)
Q6
Will the close of an fd cause it to be removed from all epoll sets automatically?
A6
Yes.
Спасибо за комментарии, учту все: на русском, кратко и сжато, с libevent.
Thanks a lot)
реально epoll появилась уже давно и не для кого не секрет)
Еще не плохо было бы сделать обработку EPOLLERR в цикле, т.к. если этого не сделать, то программка может упасть.
Например, так:// ...
for(int i = 0; i < epoll_events_count ; i++)
{
if(events[i].events & EPOLLERR)
{
// обработка ошибки, например:
close(events[i].data.fd);
clients_list.remove(events[i].data.fd);
continue;
}
// ...