博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IO复用——epoll系列系统调用
阅读量:7281 次
发布时间:2019-06-30

本文共 1649 字,大约阅读时间需要 5 分钟。

1、内核事件表

    epoll是Linux特有的I/O复用函数。epoll把用户关心的文件描述上的事件放在内核里的一个事件表中,并用一个额外的文件描述符来标识该内核事件表。这个额外文件描述符使用函数epoll_create函数来创建。

#include
int epoll_create(int size)

    size参数给内核提示事件表需要多大。该函数返回的文件描述符用作其他epoll函数的第一个参数,标识要访问的内核事件表。

2、epoll_ctl函数

    此函数用来操作内核事件表,操作类型有三种:

  • EPOLL_CTL_ADD     往事件表中注册事件
  • EPOLL_CTL_MOD    修改注册事件
  • EPOLL_CTL_DEL       删除注册事件
#include
int epoll_ctl(int epfd, int op, int fd, struct epoll_event* event) //成功返回0,失败返回-1并置errno

    fd参数是要操作的文件描述符,op参数指定操作类型,event参数指定事件,epoll_event定义如下:

struct epoll_event{    _uint32_t events;    //epoll事件     epoll_data_t data;   //用户数据};

    其中events成员描述事件类型,data成员用于存储用户数据,epoll_data_t定义如下:

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

    此为一个共用体,使用最多的是fd,它标识事件所从属的目标文件描述符。ptr成员可用来指定与fd相关的用户数据。

3、epoll_wait函数

    此函数为epoll系列主要系统调用函数,它在一段超时时间内等待一组文件描述符上的事件。

#include
int epoll_wait(int epfd, stuct epoll_event* events, int maxevents,int timeout)

    此函数成功返回时返回就绪文件描述符的个数,失败返回-1并置errno。

    timeout参数指定超时时间,maxevents参数指定最多监听多少个事件,必须大于0。epfd指定内核事件表,函数成功返回时,events参数指向一个数组,数组用于输出就绪事件,数组的大小就是函数返回的就绪文件描述符个数。

//索引epoll返回的就绪文件描述符int ret = epll_wait(epllfd, events, MAX_EVENT_NUMBER, -1);for(int i = 0; i < ret; i++){	int sockfd = events[i].data.fd;	/*sockfd是已经就绪的文件描述符,直接处理*/}

4、LT和ET模式

    epoll对文件描述符的操作有两种模式:LT模式和ET模式。LT为默认模式,当往epoll内核事件表中注册一个文件描述符上的EPOLLET事件时,epoll将按照ET模式来操作该文件描述符。

    LT模式和ET模式区别:对于LT模式,epoll_wait检测到其上有事件发生并将此事件通知应用程序后,应用程序可以不立即处理该事件,当应用程序下次调用epoll_wait时,该就绪事件还会被通告到应用程序,直到事件被处理。而对于ET工作模式,当epoll_wait检测到事件发生时通知应用程序,应用程序必须立即处理,因为后面epoll_wait不会再通告此事件发生。这样ET模式比LT模式减少了同一个epoll事件被重复触发的次数,效率较高。

转载于:https://www.cnblogs.com/fangyan5218/p/10618257.html

你可能感兴趣的文章
Struts1 MVC框架的工作原理
查看>>
xdebug调试一直等待连接
查看>>
写个线程池
查看>>
android面试题之四
查看>>
NET 开发者必备的工具箱
查看>>
程序员爬《邪不压正》影评,发现细丝极恐的细节,电影就要这样看
查看>>
这大概是全世界最酷的“工牌”!拿到的中国人个个都不简单
查看>>
当京东小哥坐在电影院的前排,抬头看到了这样的一幕
查看>>
巴西数字支付公司StoneCo美国上市 蚂蚁金服是股东
查看>>
张超《独家记忆》番外来袭 获封“宝藏男神”
查看>>
益海嘉里为健康中国“加油”
查看>>
10月豪华品牌仅3家增速超10% 最差的月销204台 高增长将成过去?
查看>>
微信到底该不该封杀多闪,聊天宝还有马桶APP
查看>>
阿里巴巴成为国家信息安全漏洞库(CNNVD)支撑单位
查看>>
手摸手,带你用vue撸后台 系列二(登录权限篇)
查看>>
10种JavaScript开发者必备的VS Code插件
查看>>
数据库中间件 MyCAT 源码分析 —— XA分布式事务
查看>>
3月份Github上最热门的数据科学和机器学习项目TOP7
查看>>
再析cookie和session
查看>>
iOS下日志记录
查看>>