epoll之二:epoll实战

epoll_create系统调用

int epoll_create(int size);

epoll_create返回 一个句柄,之后epoll的 使用都将依靠这个 句柄 来 标识,参数 size是告诉epoll所要处理的大致事件数目,不再使用epoll时,必须调用close 关闭这个句柄。

size这个参数只是 告诉内核这个epoll对象会处理的事件大致数目,而不是 能够处理 的事件的最大个数

epoll_ctl系统 调用

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

epoll_ctl向epoll对象中添加、修改或是删除感兴趣的事件,返回0表示成功,否则 返回-1,此时要根据 errno错误 码判断错误类型,epoll_wait方法返回的 事件必然通过epoll_ctl添加到epoll中的。参数epfd是epoll_create返回的句柄。
参数op的意义表:

op的取值意义
EPOLL_CTL_ADD添加新的事件到epoll中
EPOLL_CTL_MOD修改epoll中的 事件
EPOLL_CTL_DEL删除epoll中的事件

第三个参数fd是待监测的连接套接字,第四个 参数是 告诉 epoll对什么样的事件感兴趣,使用了epoll_event结构体,前面介绍过了epoll实现机制中会对每一个事件创建epitem 结构体,而 在 epitem中有一个epoll_event类型的event成员

struct epoll_event{
  _uint32_t events;
  epoll_data_t data;
};
                          表 epoll_event中的events的 取值 意义
events的值意义
EPOLLIN表示对应的连接上 有数据可以读出
EPOLLOUT表示对应的 连接上可以写入 数据发送
EPOLLRDHUP表示TCP连接的远端 关闭或是半关闭连接
EPOLLPRI表示对应的连接上 有紧急数据需要读
EPOLLERR表示对应的连接上发生 错误
EPOLLHUP表示对应的连接已经挂起
EPOLLET表示触发方式设置为边缘触发(ET)系统默认是水平 触发(LT)
EPOLLONESHOT表示对 这个事件只处理 一次,下次需要处理时要重新加入epoll

而data成员是一个epoll_data联合,定义如下:

typedef union  epoll_data{
    void  *ptr;
    int  fd;
    uint32_t u32;
    uint64_t  u64;

}epoll_data_t;

data这个成员还与具体使用方式相关,ngx_epoll_module模块只使用了 联合的ptr成员,作为指向ngx_connection_t连接的指针。

epoll_wait系统调用

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

收集在epoll监控的 事件中已经发生的 事件,如果 epoll中没有任何 一个事件 发生,则 最多等待timeout毫秒返回,epoll_wait的 返回值表示当前发生事件的个数,入果返回0,则表示没事件发生,如果为-1,表示出现错误,需要检查errno错误类型判断错误类型。第一参数epfd是epoll的描述符,第二个参数events则是分配好的epoll_event结构体数组,epoll将会把发生的事件复制到events数组中,第三个参数maxevents表示本次可以返回的最大次数数目,通常来说maxevents和预分配的events数组大小是相等。第四个参数timeout表示没有检测到,最多等待的时间(单位为毫秒)。

epoll有两种工作方式

  • LT(水平 触发)
  • ET(边缘 触发)

详细见博客IO复用之select poll epoll 函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿阿三

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值