epoll

select和poll:进程把所有自己连接的套接字传给内核(用户态到内核态的内存拷贝),内核寻找这些连接上没有处理的事件。
select和poll最多只能处理上千个并发连接。

epoll
1.调用epoll_create来创建1个epoll对象
2.调用epoll_ctl来向epoll对象添加、修改或者删除事件
3.调用epoll_wait来收集发生事件的连接

 

int epoll_create(int size);

size:处理的大致事件数量

 

int epoll_ctl(int epfd, int op, int fd, struct epoll_event* event);

epfd:调用epoll_create返回的句柄
op:动作,EPOLL_CTL_ADD表示添加新事件,EPOLL_CTL_MOD表示修改epoll事件,EPOLL_CTL_DEL表示删除事件
fd: 监听的描述符
event: 告诉内核监听的事件
EPOLLIN: 连接上有数据可读(包括TCP连接的远端主动关闭连接)
EPOLLOUT: 连接上写入数据发送(包括向上游服务器发起TCP连接建立成功)
EPOLLRDHUP:连接的远端关闭或半关闭
EPOLLLPRI:连接上有紧急数据需要读
EPOLLERR: 连接发生错误
EPOLLHUP: 连接被挂起
EPOLLLET: 将触发方式设置为边缘触发ET,系统默认为水平触发LT
EPOLLONESHOT: 只处理一次这个事件,下次需要处理时需重新加入epoll

 

int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);

收集在epoll对象监控的事件中已经发生的事件并返回发生的事件数量。
返回值含义
0表示等待超时,-1表示执行错误,>0表示发生的事件数量。
如果没有事件发生,则最多等待timeout毫秒后返回。
epfd:调用epoll_create返回的句柄
events:发生的事件
maxevents:返回的最大事件数目
timeout:没有事件发生时最多等待的毫秒数,-1表示永久等待

 

参考资料
Nginx事件管理之epoll模块

posted on 2023-02-04 11:09  王景迁  阅读(43)  评论(0编辑  收藏  举报

导航