UNIX网络编程4 使用epoll

本文深入介绍了UNIX网络编程中的epoll机制,强调了其相对于select/poll的优势。epoll通过内核缓存和红黑树实现高效的数据结构,当fd数量庞大时仍能保持高效率。epoll_create创建文件节点和缓存,epoll_ctl用于添加和维护fd,epoll_wait仅返回准备就绪的事件,减少了数据拷贝,提高了性能。
摘要由CSDN通过智能技术生成
使用:http://blog.chinaunix.net/uid-20384806-id-1954307.html
优点:http://blog.csdn.net/wangpengqi/article/details/9933011


源码分析 http://blog.csdn.net/chen19870707/article/details/42525887


 int epoll_create(int size);创建一个epoll的句柄,size用来告诉内核需要建通的数目一共有多大,epoll句柄会占用一个fd值。
 
 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
 epoll的事件注册函数,第一个参数是创建的epoll句柄,第二个参数表示动作:
 EPOLL_CTL_ADD 注册新的fd到epfd中
 EPOLL_CTL_MOD 修改已经注册的fd的监听事件
 EPOLL_CTL_DEL 从epfd中删除一个fd
 第三个参数是需要监听的fd,第四个参数是告诉内核需要监听什么事
 struct epoll_event {
  _unit32_t events;
  epoll_data_t data;
 }
 events可以是一下几个宏的组合
 EPOLLOIN 表示对应的文件描述符可以读,包括对端的socket正常关闭
 EPOLLOUT 可写
 EPOLLPRI 有紧急的数据可读
 EPOLLERR 发生错误
 EPOLLHUP 被挂断
 EPOLLET  将EPOLL设为边缘触发,这是相对于水平触发来说的
 EPOLLONESHOT 只监听一次事件,完了还还需要监听这个fd的话需要重新加入到EPOLL队列里
 epoll_data_t data是一个结构体,里面包含了fd。
 
 int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
 参数events用来从内核得到事件的集合,maxevents告知内核这个events有多大,timeout可以设超时毫秒或立即返回或阻塞,
 该函数返回要处理的事件数目,或者超时无事件0。


 水平触发:LT,默认工作方式,同时支持block和non-block socket,内核通知就绪以后如果不对就绪的fd进行IO操作,内核还是会继续通知你。
 边缘触发:ET,高速工作方式,只支持non-block socket,当描述符从未就绪变为就绪时&#x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值