封装poll和epoll

本文介绍了如何封装poll和epoll,以提供统一的接口和增强易用性。通过Poller、PollPoller和EPollPoller类的设计,实现了对底层异步I/O操作的抽象,简化了文件描述符事件的管理和分发。Channel类负责单个文件描述符的事件处理,而Poller则管理多个Channel并处理事件监听。封装后的接口允许在不关注具体实现的情况下,轻松切换或复用poll和epoll。文中还给出了使用封装后的Poller实现的echo服务器示例。
摘要由CSDN通过智能技术生成

select、poll和epoll详解中提到了可以对poll和epoll进行封装,提供统一的接口。封装目的主要有两个:复用和易用,以下封装希望屏蔽poll和epoll使用时的诸多细节,提供简单易用的接口
珠玉在前,本文所提供的代码参考自muduo网络库,另外代码有用到tools-cxx中提供的base库和log库

框架

首先看一下整体类图:
poller类图
PollPoller和EPollPoller分别对poll和epoll进行了封装,两者继承自Poller,Poller提供了统一的接口
Channel封装了事件分发机制,与Poller是聚合关系

Channel

Channel对象负责文件描述符事件的分发,每个Channel对象自始至终只负责一个文件描述符的事件分发,Channel对象中保存了其负责的文件描述符的事件处理函数,事件发生时会调用响应的事件处理函数。值得注意的是:Channel不持有对应的文件描述符,即不负责close
Channel.h如下,源文件见Channel.cpp [1]

#ifndef CHANNLE_H_
#define CHANNLE_H_

#include <functional>

#include "tools/base/noncopyable.h"

class Poller;

class Channel : noncopyable {
public:
  Channel(Poller *poller, int fd);
  ~Channel() = default;

  int get_fd() const {
    return m_fd;
  }

  int get_events() const {
    return m_events;
  }

  int get_revents() const {
    return m_revents;
  }

  void set_revents(int revents){
    m_revents = revents;
  }

  int get_index() const {
    return m_index;
  }

  void set_index(int index){
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值