首页 > 代码库 > select与epoll
select与epoll
select的api:
#include <sys/select.h> #include <sys/time.h> int select(int maxfdp1,fd_set *readset,fd_set *writeset,fd_set *exceptset,const struct timeval *timeout) 返回值:就绪描述符的数目,超时返回0,出错返回-1
epoll的api:
#include <sys/epoll.h> int epoll_create(int size);//创建epoll句柄 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);//注册事件 int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);//等待事件发生,返回事件发生的个数
epoll的两种工作模式:
LT模式(默认):当epoll_wait检测到描述符事件发生并将此事件通知应用程序,应用程序可以不立即处理该事件。下次调用epoll_wait时,会再次响应应用程序并通知此事件。
ET模式:当epoll_wait检测到描述符事件发生并将此事件通知应用程序,应用程序必须立即处理该事件。如果不处理,下次调用epoll_wait时,不会再次响应应用程序并通知此事件。
ET模式在很大程度上减少了epoll事件被重复触发的次数,因此效率要比LT模式高。epoll工作在ET模式的时候,必须使用非阻塞套接口,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。
select与epoll的区别
1.select实现需要自己不断在内核态轮询所有fd集合,epoll只需检查就绪队列(epoll事件发生触发回调函数,回调函数把就绪的fd加入就绪链表中)
2.select每次调用都要把fd集合从用户态往内核态拷贝一次,epoll只要一次拷贝
3.select的fd集合在内核中是数组,poll是链表,epoll是hash表或红黑树来维护。
select与epoll
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。