Linux epoll机制

120 阅读1分钟

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 调度,但是只要有“消息”,立马会从这里唤醒;