epoll

1、epoll_create()

创建一个新的epoll实例。在内核中创建了一个数据,包含:需要检测的文件描述符的信息(红黑树)+ 就绪列表,存放检测到数据发送改变的文件描述符信息(双向链表)。

原型:int epoll_create(int size)
参数:

  • size : 目前没有意义了。随便写一个数,必须大于0

  • 返回值:

​ -1 : 失败; > 0 : 操作epoll实例的文件描述符

1
int epfd = epoll_create(100);
2、epoll_ctl()

对epoll实例进行管理:添加一个文件描述符信息,删除一个文件描述符信息,修改一个文件描述符信息

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)

参数:

  • epfd : 操作epoll实例的文件描述符
  • op : 要进行什么操作

​ - EPOLL_CTL_ADD: 添加

​ - EPOLL_CTL_MOD: 修改

​ - EPOLL_CTL_DEL: 删除

  • fd : 要检测的文件描述符
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
typedef union epoll_data { 
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;

struct epoll_event {
uint32_t events; // EPOLLIN/EPOLLOUT/ EPOLLERR 检测它的什么事件
epoll_data_t data;
};
//服务端代码
struct epoll_event epev;
epev.events = EPOLLIN;
epev.data.fd = lfd;
epoll_ctl(epfd, EPOLL_CTL_ADD, lfd, &epev);
3、epoll_wait()

int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout)

参数:

  • epfd : 操作epoll实例的文件描述符
  • events : 传出参数,保存发生了变化的文件描述符的信息
  • maxevents : 第二个参数结构体数组的大小
  • timeout : 阻塞时间

​ 0 : 不阻塞

​ 1 : 阻塞,直到检测到fd数据发生变化,解除阻塞

​ >0:阻塞的时长(毫秒)

  • 返回值:成功,返回发送变化的文件描述符的个数 > 0;失败 -1