目录
epoll与select、poll的区别:
epoll操作函数:
int epoll_create(int size);
epoll_ctl:
epoll_wait:
epoll与select、poll的区别:
- select,poll底层是一个线性表的结构,而epoll是一个红黑树结构。
- epoll、poll不能跨平台
- select和poll的检测是线性检测,而epoll使用的是回调机制
- select和poll存在用户/内核之间频繁拷贝数据的问题,但epoll不存在,在epoll中,内核和用户共用一块共享内存
- 使用epoll没有最大文件描述符的限制,仅受系统中进程能打开的最大文件数目限制
- 程序员通过epoll能直接拿到已就绪的文件描述符集合,不需要再次检测,而select和poll返回的集合需要判断才能知道哪些文件描述符就绪
epoll操作函数:
int epoll_create(int size);
- 函数参数:在linux2.6.8以后,该参数是忽略的,只需要指定一个>0的数即可
- 函数返回值:
- 失败:-1
- 成功:返回一个有效的文件描述符,通过这个文件描述符就可以访问创建的epoll实例
epoll_ctl:
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
- 函数的作用是管理红黑树实例上的节点,可以进行添加、删除、修改操作。
- 参数:
- epfd:epoll_create()函数的返回值,通过该参数找到epoll的实例
- op:一个枚举值。控制通过该函数该执行的操作
- EPOLL_CTL_ADD:往epoll模型中添加新节点
- EPOLL_CTL_MOD:修改epoll模型中存在的节点
- EPOLL_CTL_DEL:删除epoll模型中指定的节点
- fd:文件描述符,即要添加/修改/删除的文件描述符
- event:epoll事件,用来修饰第三个参数对应的文件描述符,指定检测该文件描述符的什么事件
- 返回值:
- 成功:0
- 失败:-1
详细解释参数event:
event是一个结构体,有两个成员:events和data。
- events:是一个委托epoll检测的事件,可以指定的epoll事件(常用)
- EPOLLIN:读事件, 接收数据, 检测读缓冲区,如果有数据该文件描述符就绪
- EPOLLOUT:写事件,发送数据,检测写缓冲区,如果可写文件描述符就绪
- EPOLLERR:异常事件
- data:传入的指定数据(备注传入事件的一些信息,例如事件存储在哪一个文件描述符),添加文件描述符时,没有指定任何data信息,则传出时,data联合体中没有数据,data中含有四个成员,一般情况下指定fd 。
epoll_wait:
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
- epfd:epoll_create()函数的返回值,通过该参数找到epoll的实例
- events:传出参数,这是一个结构体数组的地址,里面存储了已就绪的文件名描述符信息
- maxevents:修饰第二个参数,结构体数组的容量
- tomeout:如果检测的epoll实例中没有就绪的文件描述符,该函数的阻塞时长
- 0:函数不阻塞
- >0:如果epoll中没有已就绪的文件描述符,函数阻塞的毫秒数再返回
- -1:函数一直阻塞
- 返回值:
- 成功:=0:函数阻塞被强制解除,没有检测到满足条件的文件描述符。>0:返回检测到已就绪的文件描述符个数
- 失败:-1