epoll学习笔记

来源:互联网 发布:极光卡五星源码出售 编辑:程序博客网 时间:2024/05/17 07:23

两种触发模式:

1.Edge Triggered(ET)边缘触发(“高速”模式):仅当状态发生变化时才会通知。只会提示一次,直到下次再有数据流入之前都不会再提示。


2.Level Triggered(LT)水平触发(默认):只要还有没有处理的事件就会一直通知(类似于select/poll操作)。只要fd还有数据可读,每次epoll_wait都会返回它的事件,提醒用户程序去操作。



阻塞与非阻塞是套接字层面的。

同步与异步是操作系统本身的概念。



Apache使用select/poll复用模式->轮询空闲的fd,代价:O(n)

epoll实现了对文件描述的“开关”设定,也就是回调机制,当一个fd准备就绪之后,它会主动去触发回调,通知用户程序自己已经就绪,不需要轮询,代价:O(1)



epoll的三个基本调用:

1.int epoll_create()创建一个epoll句柄,其实也是一个fd。


2.int epoll_ct(int epfd, int op, int fd, struct epoll_event * event)对一个epoll句柄epfd操作。

op(操作方式):   a.EPOLL_CTL_ADD添加一个句柄(fd)到epoll中。

                                 b.EPOLL_CTL_MOD修改句柄fd的监听方式。

                                 c.EPOLL_CTL_DEL从epoll中移除句柄fd。

fd:是操作数(也是一个文件句柄)

events:是事件属性,包括两部分:      a.event.data.fd:当前需要监听的句柄。

                                                                b.event.events:需要监听的事件类型集合(主要有下面8种事件类型)。

事件类型:  1.EPOLLIN:读事件;

                    2.EPOLLOUT:写事件;

                    3.EPOLLRDHUP:客户端半关闭;

                    4.EPOLLPRI:高优先级 读;

                    5.EPOLLERR:连接错误(不需要特别指定);

                    6.EPOLLHUP:客户端主动关闭(不需要特别指定);

                    7.EPOLLONESHOT:一次性使用;

                    8.EPOLLET:边缘触发。


3.int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout)等待(检查)epoll事件发生。

epoll:需要检查的epoll句柄;

events:结果暂存数组;

maxevents:可以返回的事件最大数;

timeout:等待时间(经常设为-1)。



epoll:多线程多进程。






原创粉丝点击