博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
epoll 使用小结
阅读量:7082 次
发布时间:2019-06-28

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

了解一下

Epoll 是一种高效的管理socket的模型,相对于select和poll更加高效。

数据结构

  • sys/epoll.h
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 /      };

(1) epoll_data 联合体用来保存触发事件的某个文件描述符相关的数据.

(2) epoll_event 结构体的events字段是表示感兴趣的事件和被触发的事件:

EPOLLIN :表示对应的文件描述符可以读;EPOLLOUT:表示对应的文件描述符可以写;EPOLLPRI:表示对应的文件描述符有紧急的数据可读EPOLLERR:表示对应的文件描述符发生错误;EPOLLHUP:表示对应的文件描述符被挂断;EPOLLET:表示对应的文件描述符设定为edge模式

函数

*epoll_create, epoll_create1 函数

函数声明:int epoll_create(int size)
该函数生成一个epoll专用的文件描述符,其中的参数是指定生成描述符的最大范围。

  • epoll_ctl函数

函数声明:int epoll_ctl(int epfd, int op, int fd, struct epoll_event event) 该函数用于控制某个文件描述符上的事件,可以注册事件,修改事件,删除事件。

参数:epfd:由 epoll_create 生成的epoll专用的文件描述符;
op:要进行的操作例如注册事件:

EPOLL_CTL_ADD 注册、EPOLL_CTL_MOD 修改、EPOLL_CTL_DEL 删除
  • epoll_wait函数
    函数声明: int epoll_wait(int epfd,struct epoll_event events,int maxevents,int timeout) 该函数用于轮询I/O事件的发生;
    参数:
    epfd: 由epoll_create 生成的epoll专用的文件描述符;
    epoll_event: 用于回传代处理事件的数组;
    maxevents: 每次能处理的事件数;
    timeout: 等待I/O事件发生的超时值(ms);-1永不超时,直到有事件产生才触发,0立即返回。返回发生事件数。-1有错误。

Sample:

int main(){    //声明epoll_event结构体的变量,ev用于注册事件,数组用于回传要处理的事件    struct epoll_event ev,events[20];    epfd=epoll_create(10000); //创建epoll句柄       listenfd = socket(AF_INET, SOCK_STREAM, 0);    //把socket设置为非阻塞方式    setnonblocking(listenfd);       bzero(&serveraddr, sizeof(serveraddr));    serveraddr.sin_family = AF_INET;    serveraddr.sin_addr.s_addr = INADDR_ANY;    serveraddr.sin_port=htons(SERV_PORT);    bind(listenfd,(struct sockaddr )&serveraddr, sizeof(serveraddr));    listen(listenfd, 255);    //设置与要处理的事件相关的文件描述符    ev.data.fd=listenfd;    //设置要处理的事件类型    ev.events=EPOLLIN;    //注册epoll事件    epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd,&ev);    for ( ; ; )    {      //等待epoll事件的发生      nfds=epoll_wait(epfd,events,20,1000);      //处理所发生的所有事件      for(i=0;i

转载于:https://www.cnblogs.com/ikaka/p/4858508.html

你可能感兴趣的文章
iOS少用的框架
查看>>
cdn
查看>>
TypeScript基础入门之JSX(二)
查看>>
C4D操作 延迟 ,卡顿罕见状况解决方案。
查看>>
面向对象二次整理(基础,属性引用,方法引用.绑定方法)
查看>>
[C++参考]私有成员变量的理解
查看>>
学习该有的思维方式
查看>>
Linux:查看磁盘空间占用情况
查看>>
redis发布订阅
查看>>
dubbo+zookeeper
查看>>
3D打印材料的发展现状(1)
查看>>
GPGPU之应用于Mapped Reduced
查看>>
html dom的nodetype值介绍,HTML DOM nodeType用法及代码示例
查看>>
html怎么对多个td应用样式,html – 如何将样式类应用于td类?
查看>>
Proxmox集群ceph报“ceph 1pg inconsistent”错误解决备忘
查看>>
多级菜单系统安装维护shell脚本实现企业级案例
查看>>
那些年,我玩过的操作系统
查看>>
Lync Server 2013标准版升级Skype for Business Server 2015实战(上)
查看>>
新浪、万网前系统架构师高俊峰:统一监控报警平台架构设计思路
查看>>
2011-9-25俱乐部活动
查看>>