epoll编程接口(上)

epollAPI是Linux系统专有的。
epollAPI的核心数据结构称作epoll实例,它和一个打开的文件描述符相关。这个文件描述符不是用来做IO操作的,相反,它是内核数据结构的句柄,这些内核数据结构实现的目的有两个:

  • 记录了在进程中声明过的感兴趣的文件描述符列表
  • 维护了处于IO就绪状态的文件描述符列表
    epollAPI由以下三个系统调用组成:
    创建epoll实例:epoll_create()
    系统调用epoll_create()创建了一个新的epoll实例,其对应的兴趣列表初始化为空。

#include<sys/epoll.h>
int epoll_create(int size);
返回文件描述符表示成功,返回-1表示失败

参数size指定了我们想要通过epoll实例来检查的文件描述符的个数。注:该参数并不是一个上限,而是告诉内核应该如何为内部数据结构划分初始大小。
epoll_create()返回了代表新创建的epoll实例的文件描述符。该文件描述符在其他几个epoll系统调用中用来表示epoll实例。当该文件描述符不在需要时,应该通过close()来关闭

修改epoll的兴趣列表epoll_ctl()
系统调用epoll_ctl()能修改由文件描述符epfd所代表epoll实例中的intrest list。

#include <sys/epoll.h>
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *ev);
返回0表示成功,-1失败

参数fd指明了要修改intrest list中的哪一个文件描述符的设定。注意:这里的fd不能作为普通文件或者目录文件描述符。
参数op用来指定需要的执行操作,它的值可以是:
EPOLL_CTL_ADD:
将描述符fd添加到epoll实例的intrest list中去。
EPOLL_CTL_MOD:
修改文件描述符fd上设定的事件,需要用到ev所指向的结构体中的信息。
EPOLL_CTL_DEL:
将文件描述符从epfd的intrest list中移除,该操作忽略参数ev。关闭一个文件描述符会自动将其从所有的epoll实例的兴趣列表中删除。

事件等待:epoll_wait()
系统调用epoll_wait()返回epoll实例中处于就绪状态的文件描述符信息。单个epoll_wait()调用能返回多个就绪文件描述符信息。

#include <sys/epoll.h>
int epoll_wait(int epfd, struct epoll_event *evlist, int maxevents, int timeout);
返回准备就绪的文件数,失败返回-1;

参数evlist所指向的结构体数组中返回的是有关就绪状态的文件描述符信息。其空间由调用者申请,所包含的元素个数在maxevents中指定。
在数组evlist中,每个元素返回的都是单个就绪态文件描述符的信息。
events字段是一个位掩码,它指定了我们为待检查的描述符fd上所感兴趣的事件集合,events字段返回了在该文件描述符上已发生的事件掩码。
Data字段返回的是我们在描述符上使用epoll_ctl()注册感兴趣事件时在ev.data中所指定的值,需要注意的是,data字段是唯一可可获知同这个事件相关的文描述符的途径。
参数timeout用来确定epoll_wait()的阻塞行为
-1:调用将一直阻塞
0:执行一次非阻塞检查
大于0:阻塞之多timeout毫秒。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值