Apache中的挂钩剖析(1)[3]

[入库:2006年2月23日] [更新:2007年3月24日]

本文简介:

#define APR_HOOK_FIRST            0
#define APR_HOOK_MIDDLE           10
#define APR_HOOK_LAST             20
#define APR_HOOK_REALLY_LAST      30
从上面可以看出,nOrder的值得范围介于-10到30之间。如果函数是在列表中是必须第一个得到的,则必须将其设置为APR_HOOK_FIRST或者APR_HOOK_REALLY_FIRST;如果是必须最后一个调用的,则将其设置为APR_HOOK_LAST或者APR_HOOK_REALLY_LAST。如果其调用次序无关紧要,则可以设置为APR_HOOK_MIDDLE。
所有挂钩最终通过排序函数进行,这个我们在后面的部分介绍。
(3)、link##_DECLARE(ret) ns##_run_##name args; \
挂钩的定义最终是为了被调用,因此Apache中定义了对挂钩的调用函数。通常挂钩调用函数形式如下:ap_run_hookname();上面的宏真是用来定义挂钩调用函数。
比如对于post_config挂钩而言,其对外的调用函数则是ap_run_post_config()。
(4)、APR_IMPLEMENT_HOOK_GET_PROTO(ns,link,name); \
该宏展开后如下所示
#define APR_IMPLEMENT_HOOK_GET_PROTO(ns,link,name) \
link##_DECLARE(apr_array_header_t *) ns##_hook_get_##name(void)
该宏了用于返回挂钩访问函数原型,在模块外部可以调用改函数获得注册为该挂钩的所有函数。参数ns和link分别为挂钩函数名字空间前缀和联接申明前缀,一般情况为ap和AP,name为挂钩名。访问函数的原型一般为AP_DECLARE(apr_array_header_t *) ap_hook_get_name(void)。如果对于post_config挂钩而言,该宏对应的则是AP_DECLARE(apr_array_header_t *) ap_hook_get_post_config(void)。通过该函数,Apache可以获取挂钩定义的原型。
(5)、typedef struct ns##_LINK_##name##_t \
{ \
    ns##_HOOK_##name##_t *pFunc; \
    const char *szName; \
    const char * const *aszPredecessors; \
    const char * const *aszSuccessors; \
    int nOrder; \
} ns##_LINK_##name##_t;
该宏定义了一个结构类型,用来保存挂钩的相关定义信息,比如挂钩的调用函数指针、挂钩名称等等,这些信息与在挂钩定义宏中的信息完全相同。比如对于post_config来说,其展开后的结果如下所示,结构中每个字段的含义前面已经说明,此处不再赘述。
typedef struct ap_LINK_post_config_t
{
    ap_HOOK_post_config_t *pFunc;
    const char *szName;
    const char * const *aszPredecessors;
    const char * const *aszSuccessors;
    int nOrder;
} ap_LINK_post_config_t;
为此,我们可以看到,尽管对外我们声明的仅仅是AP_DECLARE_HOOK宏,而内部却一口气实现了五个功能,每个功能彼此相关。

本文关键:Apache中的挂钩剖析(1)
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top