linux利器:epoll的前世今生

非阻塞I/O加上I/O复用,渐渐帮助我们在高性能网络编程这个领域搭建了初步的基石/

epoll增添足够的动力.

select  poll   epoll 的区别

由图可知  epoll的性能是最好的,也很稳定,变化不大

epoll还是一种I/O多路复用技术epoll

epoll通过监控注册的描述字,来进行I/O事件的分发处理。不同于poll的是,

epoll提供 level-triggered机制和edge-triggered   条件触发和边缘触发

 

epoll网络编程的步骤  epoll_creat,epoll_ctl和epoll_wait

 

epoll_create


int epoll_create(int size);
int epoll_create1(int flags);
        返回值: 若成功返回一个大于0的值,表示epoll实例;若返回-1表示出错

 

epoll_ctl

 


 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
        返回值: 若成功返回0;若返回-1表示出错

创建完epoll实例之后,可以通过epoll——ctl往这个epoll实例增加或删除监控的事件

epfd 为 epol文实例描述字

op 操作,表示删除 增加,修改监控事件

   EPOLL_CTL_ADD : 注册

   EPOLL_CTL_DEL: 向epoll实例删除文件描述符对应事件

   EPOLL_CTL_MOD:修改文件描述符对应的事件

第三个注册参数时  注册的事件的文件描述符,一个监听套芥子

第四个参数为注册的事件类型


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 */
 };

 

epoll_wait

 


int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
  返回值: 成功返回的是一个大于0的数,表示事件的个数;返回0表示的是超时时间到;若出错返回-1.

第一个参数时eoill实例描述字,也就是epoll句柄

第二个参数返回给用户空间需要处理的i/o事件,这是一个数组,数组的大小由epoll_wait的返回值决定

这个数组的每个元素都是一个需要待处理的I/O事件,events表四具体的事件类型

第三个参数,表示epoll_wait可以返回的最大值

第四个参数时epoll_wait阻塞调用的超时值,如果这个值设置为-1 表示不超时,如果设置为0则立即返回,

即使没有任何i/o事件发生

 

 

边缘触发和条件触发:

条件触发   只要满足事件的条件,比如有数据可读,就一直不断的把这个事件传递给用户

边缘触发的意思时 只有第一次满足条件的时候才会触发,之后就不会再传递相同的事件

 

epoll通过改进的接口设计,避免了用户太-内核太频繁的数据拷贝,大大提高了系统性能,在使用epoll的时候

我们一定呀

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值