epoll模型采用基于事件的通知方式,事先为建立连接的文件描述符注册事件,一旦该文件描述符就绪,内核会采用类似callback的回调机制,将文件描述符加入到epoll的指定的文件描述符集中,之后进程再根据该集合中文件描述符的数量,对客户端请求逐一进行处理。
关键函数:
/**
* open an epoll file descriptor
* return: epfd -epoll池的根节点
*/
int epoll_create();
/**
* control interface for an epoll file descriptor
* params: epfd -epoll_create的返回值
* op - EPOLL_CTL_ADD,EPOLL_CTL_DEL,EPOLL_CTL_MOD
* fd - 要监听的file descriptor
* event - 事件结构体指针
* epoll_event->events 可用的值,表示感兴趣的 epoll 事件*/
* #define EPOLLIN 0x00000001
* #define EPOLLOUT 0x00000004
* #define EPOLLERR 0x00000008
* #define EPOLLHUP 0x00000010
* struct epoll_event {
* __u32 events;
* __u64 data;
* } EPOLL_PACKED;
*
*/
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
/**
* wait for an I/O event on an epoll file descriptor
* params: epfd - epoll_create的返回值
* events - epoll 将发生的事件集合,从内核空间复制到该数组中
* maxevents - 事件最大数量
* timeout - 是否阻塞,-1:阻塞,0:不阻塞
*/
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout)
epollcreate负责创建一个池子,一个监控和管理句柄 fd 的池子;epollctl负责管理这个epoll池里的 fd 增加、删除、修改;epollwait就是负责阻塞的,让出 CPU 调度,但是只要有“消息”,立马会从这里唤醒;