文章目录
0. epoll初识
按照man手册的说法: 是为处理大批量句柄而作了改进的poll. 它是在2.5.44内核中被引进的(epoll(4) is a new API introduced in Linux kernel 2.5.44) 它几乎具备了之前所说的一切优点,被公认为Linux2.6下性能最好的多路I/O就绪通知方法。
1. epoll的相关系统调用
epoll 有3个相关的系统调用
1-1 epoll_create
-
创建一个epoll的句柄
- 自从linux2.6.8之后, size参数是被忽略的.
- 用完之后, 必须调用close()关闭
接口:
#include <sys/epoll.h>
int epoll_create(int size);
一旦成功,这些系统调用将返回一个非负的文件描述符。出现错误时,返回-1,并将errno设置为指示错误。
1-2 epoll_ctl
#include <sys/epoll.h>
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
成功后,epoll_ctl()返回零。当发生错误时,epoll_ctl()返回-1,并适当设置errno。
epoll的事件注册函数
- 它不同于select()是在监听事件时告诉内核要监听什么类型的事件, 而是在这里先注册要监听的事件类型.
- 第一个参数是epoll_create()的返回值(epoll的句柄).
- 第二个参数表示动作,用三个宏来表示.
- 第三个参数是需要监听的fd.
- 第四个参数是告诉内核需要监听什么事
第二个参数的取值:
取值 | 含义 |
---|---|
EPOLL_CTL_ADD | 注册新的fd到epfd中 |
EPOLL_CTL_MOD | 修改已经注册的fd的监听事件 |
EPOLL_CTL_DEL | 从epfd中删除一个fd; |
struct epoll_event结构如下:
typedef union epoll_data
{
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;