做以简单区分为面试作答提供一些帮助:
select 和 epoll都为一种网络I/O模型,都是采用了檢測了句柄集合中的数据,来实现多路复用。
select文件句柄检测数有限,内核中_FD_SETSIZE定义为2048超出范围将无法检测,在扫描上select
采用的是轮询的方式当检测的量太大时会造成轮询不过来引起的超时。为了克服select的缺陷
linux引入了epoll其特点是句柄集合量没有限制,可以比select大的多,epoll只检测活跃的句柄,这样可以避免
不必要的太长时间的轮询。epoll中还使用了mmap来提高内存复制的数度只需要把消息传入内核一次就好,select
却要每次都复制。
主要函数为:create_epoll(int maxfd);创建一个epoll句柄 其中maxfd是支持的最大句柄数。
epoll_ctl(int epfd, int op, int fd, struct epoll_event* event);第一个参数是epoll_create()的返回值,
创建Epoll的专用文件描述符,相当于FD_SET 和 FD_CLR
第二个参数表示动作,用三个宏来表示
EPOLL_CTL_ADD:注册新的fd到epfd;
EPOLL_CTL_MOD:修改已经注册的fd的监听事件
EPOLL_CTL_DEL:从epfd中删除一个fd
第三个参数是要监听的fd
第四个参数是要告诉内核要监听什么事件,struct epoll_event结构如下:
struct epoll_event{
_uint32 events;
epoll_data_t data;
};
events:可以一下几个宏集合:
EPOLLIN: 表示对应文件描述符可写
EPOLLOUT: 表示对应的文件描述符可写
EPOLLPRI: 表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);
EPOLLERR: 表示对应的文件描述符发生错误;
EPOLLHUP: 表示对应的文件描述符被挂断;
EPOLLET: 将EPOLL设为边缘触发(EdgeTriggered)模式,这是相对于水平触发(LevelTriggered)来说的。
EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个
int epoll_wait(int epfd, struct epoll_event*events, int maxevents, int timeout);这个函数返回的数据是发生的事件数
等待I/O 事件的发生;参数说明:
epfd: 由epoll_create() 生成的Epoll 专用的文件描述符;
epoll_event:用于回传代处理事件的数组;
maxevents:每次能处理的事件数;
timeout: 等待I/O 事件发生的超时值;