本文在上文
《Apache Hook机制解析(上)——钩子机制的实现
》的基础上,对钩子机制的细节了补充分析。
1. 静态变量_hooks
这个变量由宏APR_HOOK_STRUCT所定义,因为是静态的,所以对这个变量的操作只能在同一源文件中实现——也对应的AP_IMPLEMENT_HOOK_RUN_ALL宏必须在APR_HOOK_STRUCT所在的源文件中被定义。
2. AP__开头的宏和APR__开头的宏
APR指Apache Portable Runtime,它是一个基本的库,可以用于 Apache HTTP Server,也可用于其他产品;而AP实际上指 Apache HTTP Server。
因此AP__开头的宏很多都是对APR__宏的进一层封装,将其封装到 Apache HTTP Server的命名空间,如AP_IMPLEMENT_HOOK_RUN_ALL实际上是APR_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL宏的封装:
#define AP_IMPLEMENT_HOOK_RUN_ALL(ret,name,args_decl,args_use,ok,decline) /
APR_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL(ap,AP,ret,name,args_decl, /
args_use,ok,decline)
如果是要在自己写的代码中调用APR库,则必须使用APR__开头的宏。
3. AP_IMPLEMENT_HOOK_RUN_ALL的变种
在 apr_hooks.h中的代码中可以看到,除了AP_IMPLEMENT_HOOK_RUN_ALL宏之外,还有两个用于定义钩子的宏:
APR_IMPLEMENT_EXTERNAL_HOOK_VOID
AP_IMPLEMENT_HOOK_RUN_FIRST
第一个宏是为了无参数的钩子函数准备的,对应前面log_transaction的例子,该宏展开后的触发函数代码如下:
1. 静态变量_hooks
这个变量由宏APR_HOOK_STRUCT所定义,因为是静态的,所以对这个变量的操作只能在同一源文件中实现——也对应的AP_IMPLEMENT_HOOK_RUN_ALL宏必须在APR_HOOK_STRUCT所在的源文件中被定义。
2. AP__开头的宏和APR__开头的宏
APR指Apache Portable Runtime,它是一个基本的库,可以用于 Apache HTTP Server,也可用于其他产品;而AP实际上指 Apache HTTP Server。
因此AP__开头的宏很多都是对APR__宏的进一层封装,将其封装到 Apache HTTP Server的命名空间,如AP_IMPLEMENT_HOOK_RUN_ALL实际上是APR_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL宏的封装:
#define AP_IMPLEMENT_HOOK_RUN_ALL(ret,name,args_decl,args_use,ok,decline) /
APR_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL(ap,AP,ret,name,args_decl, /
args_use,ok,decline)
如果是要在自己写的代码中调用APR库,则必须使用APR__开头的宏。
3. AP_IMPLEMENT_HOOK_RUN_ALL的变种
在 apr_hooks.h中的代码中可以看到,除了AP_IMPLEMENT_HOOK_RUN_ALL宏之外,还有两个用于定义钩子的宏:
APR_IMPLEMENT_EXTERNAL_HOOK_VOID
AP_IMPLEMENT_HOOK_RUN_FIRST
第一个宏是为了无参数的钩子函数准备的,对应前面log_transaction的例子,该宏展开后的触发函数代码如下: