muduo源码分析之事件处理器-Channel

本文分析了muduo库中的Channel类,作为事件处理器的角色,它封装了可能产生事件的文件描述符,并通过enable和disable系列函数控制其在EventLoop中的状态。Channel的update函数与EventLoop的Poller协同工作,实现对Linux IO复用设施(如epoll)的事件注册和更新。文章详细阐述了Channel如何与EventLoop、Poller交互,以及事件处理器的添加和删除流程。
摘要由CSDN通过智能技术生成

  前面两篇对Acceptor和TcpConnection的分析中,我们知道他们最终都是通过Channel和Eventpool简历连接,而且真正的事件处理函数也都是封装在Channel类中的。所以这里我把Channel看成事件处理器。
  除了事件处理函数之外,Channel也是必须将可能产生事件的文件描述符封装在其中的。这里的文件描述符可以是file descriptor,可以是socket,还可以是timefd,signalfd。文件描述符是最终需要加入到linux的epoll或者select等IO复用设施上的,显然这些设施是封装在了Eventpool中,这个我们在以后会介绍到。根据前面两篇,我们知道最终影响到Channel事件处理器加入eventpool是Channel中的下面函数

  void enableReading() { events_ |= kReadEvent; update(); }
  void disableReading() { events_ &= ~kReadEvent; update(); }
  void enableWriting() { events_ |= kWriteEvent; update(); }
  void disableWriting() { events_ &= ~kWriteEvent; update(); }

可以知道enable类函数将相应的Channel事件处理器加入到eventpool中,disable类函数将相应的事件处理器从eventloop中删除。具体的加入动作都落入到update中,其中的event_标志位主要用于标记事件类型,熟悉epoll的话应该比较简单,下面我们看一下update函数的实现:

void Channel::update()
{
  addedToLoop_ = true; //标记这个Channel已经加入到了evenloop中
  loop_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值