Linux企业级开发技术(2)——epoll企业级开发之epoll接口
来源:互联网 发布:网络安全技术方案 编辑:程序博客网 时间:2024/05/16 08:16
epoll的接口非常简单,总共只有三个函数:
1、int epoll_create(intsize);
生成一个 Epoll 专用的文件描述符,size用来告诉内核这个监听的数目一共有多大。这个参数不同于select()中的第一个参数,给出最大监听的fd+1的值。需要注意的是,当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close()关闭,否则可能导致fd被耗尽。
其实是申请一个内核空间,用来存放你想关注的 socket fd 上是否发生以及发生了什么事件。 size 就是你在这个 Epoll fd 上能关注的最大 socket fd 数,大小自定,只要内存足够。
2、int epoll_ctl(intepfd, int op, int fd, struct epoll_event *event);
epoll的事件注册函数,它不同与select()是在监听事件时告诉内核要监听什么类型的事件,而是在这里先注册要监听的事件类型。它用来控制某个epoll 文件描述符上的事件:注册、修改、删除。其中参数 epfd 是 epoll_create() 创建 Epoll 专用的文件描述符。相当于 select 模型中的 FD_SET 和 FD_CLR 宏。
第一个参数是epoll_create()的返回值,
第二个参数表示动作,用三个宏来表示:
EPOLL_CTL_ADD:注册新的fd到epfd中;
EPOLL_CTL_MOD:修改已经注册的fd的监听事件;
EPOLL_CTL_DEL:从epfd中删除一个fd;
第三个参数是需要监听的fd,
第四个参数是告诉内核需要监听什么事,struct epoll_event结构如下:
struct epoll_event { __uint32_t events; /* Epollevents */ epoll_data_t data; /* User datavariable */};
events可以是以下几个宏的集合:
EPOLLIN : 表示对应的文件描述符可以读(包括对端SOCKET正常关闭);
EPOLLOUT: 表示对应的文件描述符可以写;
EPOLLPRI: 表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);
EPOLLERR: 表示对应的文件描述符发生错误;
EPOLLHUP: 表示对应的文件描述符被挂断;
EPOLLET: 将EPOLL设为边缘触发(EdgeTriggered)模式,这是相对于水平触发(Level Triggered)来说的。
EPOLLONESHOT: 只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里
3、int epoll_wait(intepfd, struct epoll_event * events, int maxevents, int timeout);
等待I/O事件的产生,类似于select()调用。
参数说明:
epfd: 由 epoll_create() 生成的 Epoll 专用的文件描述符;
epoll_event: 用于回传代处理事件的数组;
maxevents: 每次能处理的事件数;
timeout: 等待 I/O 事件发生的超时值;
返回发生事件数。
参数events用来从内核得到事件的集合,maxevents告之内核这个events有多大,这个maxevents的值不能大于创建epoll_create()时的size,参数timeout是超时时间(毫秒,0会立即返回,-1将不确定,也有说法说是永久阻塞)。该函数返回需要处理的事件数目,如返回0表示已超时。
4、其他epoll_XXX() 系统调用
在RHEL6的内核(主要基于2.6.32)里,还有两个与epoll有关的系统调用:
epoll_pwait(),epoll_create1()。这些只是上面三个系统调用的包装而已。pwait是做了与进程信号有关的工作,create1则是用来填补遗漏功能的。
- Linux企业级开发技术(2)——epoll企业级开发之epoll接口
- Linux企业级开发技术(3)——epoll企业级开发之epoll模型
- Linux企业级开发技术(4)——epoll企业级开发之epoll例程
- Linux企业级开发技术(1)——epoll企业级开发之简介
- Linux企业级项目实践之网络爬虫(19)——epoll接口
- Linux企业级开发技术(5)——libevent企业级开发之简介
- Linux企业级开发技术(7)——libevent企业级开发之锁和线程
- Linux企业级开发技术(6)——libevent企业级开发之内存管理
- 干货分享—Java EE企业级应用开发技术路线图
- 企业级应用vs企业级开发
- 企业级应用vs企业级开发
- Linux开发--IO多路复用之epoll总结
- 【Linux】多路复用之—epoll
- Flex技术在企业级开发中的应用(转)
- 企业级应用程序开发的技术概览
- Java企业级开发:Spring 技术内幕 学习
- Java企业级开发技术大作业
- Android数据绑定技术一,企业级开发
- PHP格式化输出json数据
- 通过Web打启动本地应用程序(一)
- 数据结构之顺序栈
- 转载!!!linux学习 tar 详细安装
- iOS拨打电话(三种方法)
- Linux企业级开发技术(2)——epoll企业级开发之epoll接口
- 寻访x86处理器“实模式”和“保护模式”的前世今生
- 进程优先级、nice值
- NPOI2.1.1创建docx图表
- 数据结构5-关于链队列的实例,打印链队列中内容
- PB级数据的快速搜索 - elasticsearch
- HttpWebRequest的偶尔请求超时问题研究
- HDU 4777 - Rabbit Kingdom (树状数组 区间互素数)
- AIX下修改用户最大进程数