类简介
- Epoll类封装了epoll的常用接口,如epoll_ctl和epoll_wait。
- 具有添加、删除、修改和处理监听事件的功能。
核心代码
处理监听事件
void Epoll::handleEvent(int listenFd, std::shared_ptr<ThreadPool>& threadPool, int eventsNum)
{
assert(eventsNum > 0);
for(int i = 0; i < eventsNum; ++i) {
HttpRequest* request = (HttpRequest*)(events_[i].data.ptr);
int fd = request -> fd();
if(fd == listenFd) {
onConnection_();
} else {
if((events_[i].events & EPOLLERR) ||
(events_[i].events & EPOLLHUP) ||
(!events_[i].events & EPOLLIN)) {
request -> setNoWorking();
onCloseConnection_(request);
} else if(events_[i].events & EPOLLIN) {
request -> setWorking();
threadPool -> pushJob(std::bind(onRequest_, request));
} else if(events_[i].events & EPOLLOUT) {
request -> setWorking();
threadPool -> pushJob(std::bind(onResponse_, request));
} else {
printf("[Epoll::handleEvent] unexpected event\n");
}
}
}
return;
}
问题
1.回调函数是如何工作的?
2.为什么使用epoll,和poll及select的区别在哪里?