EPOLL学习心得


epoll族函数:

1.    int epoll_create(int maxfds);

返回值是一个epoll句柄,也就是一个文件描述符,可以在proc/进程ID/fd 中查看到这个文件描述符,注意使用完要记得close(epolldf)。
maxfds指epoll描述符能关注大最大fd数,新版大linux内核貌似已经不关注这个值了。

2.     int epoll_ctl(int epfd, int op, int fd, struct epoll_event *ev);

成功返回0, 失败返回-1。

@int epfd : epoll_create()创建大epoll描述符。
@int op : 用三个宏来表示:
EPOLL_CTL_ADD:注册新的fd到epfd中;
EPOLL_CTL_MOD:修改已经注册的fd的监听事件;
EPOLL_CTL_DEL:从epfd中删除一个fd;
@int fd : 需要监听的文件描述符。
@struct epol event *ev: 告诉内核需要关注什么事件。

结构体原型:

typedef union epoll_data {
    void *ptr;
    int fd;
    __uint32_t u32;
    __uint64_t u64;
} epoll_data_t;

struct epoll_event {
  __uint32_t events;  /* Epoll events */
  epoll_data_t data;  /* User data variable */
};

events包括如下几个宏:
EPOLLIN :表示对应的文件描述符可以读(包括对端SOCKET正常关闭);
EPOLLOUT:表示对应的文件描述符可以写;
EPOLLPRI:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);
EPOLLERR:表示对应的文件描述符发生错误;
EPOLLHUP:表示对应的文件描述符被挂断;
EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的;
EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里。


3.    int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
@int epfd : epoll描述符。
@struct epoll_event *events : 从内核得到事件的集合。(一般建立一个events[MAXEPFDS],用来存储事件队列)。
@int maxevents : 告知内核这个队列有多大。(这个队列是内核处理同时发生事件的fd最大队列)。
@int timeout : 超时时间。(0 : 立刻返回。-1 : 阻塞直到有IO事件发生)。


EPOLL事件有两种模型:

Edge Triggered (ET)
Level Triggered (LT)

LT(level triggered)是缺省的工作方式,并且同时支持block和no-block socket.在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。如果你不作任何操作,内核还是会继续通知你的,所以,这种模式编程出错误可能性要小一点。传统的select/poll都是这种模型的代表.

ET(edge-triggered)是高速工作方式,只支持no-block socket。在这种模式下,当描述符从未就绪变为就绪时,内核通过epoll告诉你。然后它会假设你知道文件描述符已经就绪,并且不会再为那个文件描述符发送更多的就绪通知,直到你做了某些操作导致那个文件描述符不再为就绪状态了(比如,你在发送,接收或者接收请求,或者发送接收的数据少于一定量时导致了一个EWOULDBLOCK 错误)。但是请注意,如果一直不对这个fd作IO操作(从而导致它再次变成未就绪),内核不会发送更多的通知(only once),不过在TCP协议中,ET模式的加速效用仍需要更多的benchmark确认。


实例:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值