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; }
// 设置用户主动设置非阻塞

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





