[源码阅读]——Sylar服务器框架:Hook模块

本文介绍了Hook模块的概念和在sylar中的应用,主要用于系统API的封装,允许用户选择调用底层接口或自定义接口。Hook模块在sylar中实现了对文件读写、sleep、socket等的Hook,并通过FdManager管理文件句柄。通过条件定时器,实现了在遇到EAGAIN时的重试机制,以实现异步效果。同时,讲解了如何通过宏定义替换系统标准函数,实现Hook功能。然而,文章指出对于Hook的深入理解还需进一步研究。

Hook模块概述

  关于Hook模块,本人真的属于无能为力了,甚至自己很多地方都没读懂,建议大家看路强大佬的笔记Hook模块
  我所理解的hook在sylar中的应用主要就是为了对系统调用API进行一次封装,可以由用户自己选择是直接调用底层的接口,还是调用我们自己重新实现的接口。比如sleep(1),在系统实现中,就是使其睡眠1秒钟,但是我们可以选择调用我们自己实现的sleep(1),其会设定1秒钟的定时器,然后swapout到其他任务,等定时器达到了,在返回。这样的话就可以在原本只能同步进行的协程任务中(虽然协程可以swapout和swapin,但是在同一线程中其只能顺序进行),表现出异步的性能。

Hook模块实现

  sylar中的Hook模块是支持用户自己控制线程是否使用Hook,在默认情况下,线程调度会在run()函数中通过set_hook_enable(true);开启Hook,此时则系统调用会进入到hook后的API中,也就是自己编写的模块中。sylar主要针对文件读写、sleep、socket等内容进行了Hook,以及一个connect_with_timeout用于实现带超时的connect。
  除了本身的Hook的API外,sylar还实现了一个fd_manager用于管理文件句柄,FdMananger类和FdCtxl类用来记录、管理fd的上下文信息。其中,FdCtx类在用户态记录了fd的读写超时和非阻塞信息,用户可以自行设置非阻塞,也可以通过hook内部设置非阻塞。

#ifndef __FD_MANAGER_H__
#define __FD_MANAGER_H__

#include <memory>
#include <vector>
#include "thread.h"
#include "singleton.h"

namespace sylar{

// 文件句柄上下文类,管理文件句柄类型 
// FdCtx类在用户态记录了fd的读写超时和非阻塞信息
// 其中非阻塞包括用户显式设置的非阻塞和hook内部设置的非阻塞
// 区分这两种非阻塞可以有效应对用户对fd设置/获取NONBLOCK模式的情形。
class FdCtx : public std::enable_shared_from_this<FdCtx>{
public:
    typedef std::shared_ptr<FdCtx> ptr;

    // 通过文件句柄构造FdCtx
    FdCtx(int fd);
    // 析构函数
    ~FdCtx();

    // 是否初始化完成
    bool isInit() const { return m_isInit; }
    // 是否socket
    bool isSocket() const { return m_isSocket; }
    // 是否关闭
    bool isClose() const { return m_isClose; }
    // 设置用户主动设置非阻塞
   
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

甄姬、巴豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值