首页 > 代码库 > 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