Apache Hook机制解析(下)——实战:在自己的代码中使用Apache的钩子
在前文《Apache Hook机制解析(上)——钩子机制的实现》和《Apache Hook机制解析(中)——细节讨论》的基础上,我们对Apache的钩子机制已经有了较多的了解,下面的代码实战演示了一个日志钩子的声明、定义和使用,在VC6.0上编译测试通过,需要使用APR库(libapr和libaprutils)。 1. hookLog.h——声明一个名为log的钩子 #ifndef __HOOK_LOG_H__
#define __HOOK_LOG_H__
#ifdef __cplusplus
extern "C" {
#endif
#include "apr_hooks.h"
#define MY_DECLARE(type) type
APR_DECLARE_EXTERNAL_HOOK(my, MY, int, log, (const char *szText))
#ifdef __cplusplus
}
#endif 2. hookLog.c——定义一个名为log的钩子 #include "hookLog.h"
//定义名为log的钩子结构变量
APR_HOOK_STRUCT(
APR_HOOK_LINK(log)
)
//定义log相关的钩子实现,这里将0作为OK,-1作为DECLINE
APR_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL(my, MY, int, log, (const char *szText), (szText), 0, -1) 3. test.c——挂载Hook并触发 #include "hookLog.h"
#include "apr_pools.h"
/* 文件日志实现 */
static int fileLog(const char *szText)
{
FILE *fp = NULL;
fp = fopen("filelog.txt", "wt");
if (fp) {
fseek(fp, 0, SEEK_END);
fprintf(fp, "%s/n", szText);
fclose(fp);
}
return 0;
}
/* 控制台日志实现 */
static int consoleLog(const char *szText)
{
printf("%s/n", szText);
return 0;
}
int main()
{
//初始化apr库以及Hook所需的全局内存池
apr_initialize();
apr_pool_create(&apr_hook_global_pool, NULL);
//挂载Hook
my_hook_log(consoleLog, NULL, NULL, APR_HOOK_MIDDLE);
my_hook_log(fileLog, NULL, NULL, APR_HOOK_MIDDLE);
//对Hook进行排序 apr_sort_all_hooks(); //触发Hook,此调用将引发两个已挂载的钩子——fileLog和consoleLog
my_run_log("Hello World!");
//销毁内存池
apr_pool_destroy(apr_hook_global_pool);
return 0;
}
Apache Hook机制解析(下)——实战:在自己的代码中使用Apache的钩子相关推荐
- Apache Hook机制解析(中)——细节讨论
本文在上文<Apache Hook机制解析(上)--钩子机制的实现>的基础上,对钩子机制的细节了补充分析. 1. 静态变量_hooks 这个变量由宏APR_HOOK_STRUCT所定 ...
- Apache Hook机制解析(上)——钩子机制的实现
Apache中大量使用了Hook机制,使得第三方开发Module可以扩展Apache服务器的默认处理. Apache Hook功能可以简述如下: 1. 程序主框架根据名称声明和定义Hook 2. ...
- 一文读懂 Apache Pulsar详细解析和实战运用
Pulsar 介绍 Apache Pulsar 作为 Apache 软件基金会顶级项目,是下一代云原生分布式消息流平台,集消息.存储.轻量化函数计算为一体,采用计算与存储分离架构设计,支持多租户.持久 ...
- Apache Tiles 学习(二)、Java Web应用中使用Apache Tiles
摘要: 在java web项目中使用Apache tiles. 在Java Web项目中使用Apache Tiles Tiles一直是一个web应用程序包,通常结合strut一起使用.Apache T ...
- Apache运行机制剖析
Apache运行机制剖析: 1. B/S交互过程 浏览器(Browser)和服务器(Web Server)的交互过程: 1. 浏览器向服务器发出HTTP请求(Request). 2. 服务器收到浏 ...
- vs.php中使用apache或IIS7进行外部调试
vs.php中使用apache或IIS7进行外部调试 1.解决vs.php2.7在Windows7下调试apache出错的问题 vs.php默认使用内部调试模式,由于vs.php2.7默认自带的内部调 ...
- WordPress 实战:在wordpress文章中加入分享到微博及社交网站的按钮(代码实现,非插件)
随着现在微博和一些社交网站的流行,为了便于网站中文章的分享和转载,很多站长在自己的网站中都加入了分享按钮,轻轻一点,文章自动转发到你想要发布的网站上,确实很方便.我的妍熙饭yanxifan.com近日 ...
- PostgreSQL下如何修改用户权限的介绍以及hook机制对超级用户的权限修改
2019独角兽企业重金招聘Python工程师标准>>> 要想修改PG的用户权限,那么首先要对PG权限控制做一下了解: PG的权限控制是针对到各个对象的.大家可以看一下,所有系统表(p ...
- Android插件化原理解析——Hook机制之Binder Hook
Android系统通过Binder机制给应用程序提供了一系列的系统服务,诸如ActivityManagerService,ClipboardManager, AudioManager等:这些广泛存在系 ...
最新文章
- Python - Sublime Text 3 控制台不能输出中文的解决方法
- python是不是特别垃圾-python为啥比较流行(垃圾桶)
- 启发式算法简谈(一)
- 如何获取微信API的Access Token
- 区域风云企业之大立-DVR产品的新技术应用
- Loj #2324. 「清华集训 2017」小 Y 和二叉树
- 索引sql server_SQL Server索引设计基础和准则
- Android移动应用基础教程【服务】
- 拓端tecdat|python中的copula:Frank、Clayton和Gumbel copula模型估计与可视化
- linux puppy 安装软件,小芭比linux下载
- 有哪些好的科研工具软件?
- 康师傅红烧牛肉面:守护平凡英雄,成就烟火人生
- 明翰英语教学系列之语料篇V0.4(持续更新)
- windows10的etc路径下没有hosts文件
- php中怎么设计出生日期,php – 将出生日期添加到数据库
- office二级证书和mysql_二级考office还是access ??在线等 挺急的 (内附合格证书领取通知)...
- 【图像增强】基于matlab萤火虫算法图像对比度增强【含Matlab源码 2142期】
- java毕业设计SEOUL设计师品牌代购商城Mybatis+系统+数据库+调试部署
- profit from/prove to/provide with等动词词组
- 最全解释:Linux操作系统下的软件安装与管理详解(源码安装、rpm/dpkg、yum/apt-get安装)
热门文章
- python恶搞-python—做一个恶搞程序
- python最新版下载教程-各种版本的Python下载安装教程
- python用途与前景-Python就业前景如何?三大就业岗位分享
- python介绍和用途-python应用领域介绍
- python编程培训-马哥教育官网-专业Linux培训班,Python培训机构
- python爬虫实例-Python爬虫原理与python爬虫实例大全
- UVa12326 Yummy Triangular Pizza(dfs)
- 用脚本批量执行redis命令
- OAuth2.0认证和授权原理
- 值得mark的11个开源机器学习项目 .