您的位置:首页 > 理论基础 > 数据结构算法

nginx模块编程学习笔记3–模块主要数据结构

2012-12-03 10:15 134 查看
在nginx模块编写种主要会涉及到下面3个数据结构,这一篇我就先来看看这3个数据结构的作用和意义。

ngx_command_t

ngx_module_t

ngx_http_module_t

前面这两个是定义在这个文件中:src/core/ngx_core.h

typedef struct ngx_module_s ngx_module_t;

typedef struct ngx_command_s ngx_command_t;

两个结构体是在这个文件中定义的:src/core/ngx_conf_file.h

先看:ngx_command_s 这个结构体是用来保存组织配置文件中各个配置字段的。

struct ngx_command_s {

ngx_str_t name; //配置字段名称

ngx_uint_t type; //类型和作用范围

char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); //设置或是读取函数

ngx_uint_t conf; //配置域

ngx_uint_t offset; //配置字段在配置结构体种的偏移量

void *post; //暂时不知道做什么用

};

这里要提到的主要又这几个字段:type,set,conf,offset

type是标示这个配置字段的作用范围和参数设置,如:NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,

这些宏是在src/http/ngx_http_config.h中定义的,首先nginx的配置文件的作用域又三个:main,server,local,分别指全局配置域,虚拟server配置域和localtion作用域,由大而小,所以在这里指定。

这里指定的还有一个就是这个配置字段有几个参数:

#define NGX_CONF_NOARGS 0×00000001 //没有参数

#define NGX_CONF_TAKE1 0×00000002 //一个参数

。。。。

#define NGX_CONF_TAKE7 0×00000080 //7个参数

#define NGX_CONF_MAX_ARGS 8 //最大参数个数

set是一个函数指针,它主要从配置种返回这个命令字段的配置参数:

nginx系统提供了一些常用的设置函数

ngx_conf_set_flag_slot:针对于on和off这种标志处理

ngx_conf_set_str_slot: 对一般的字符串配置

ngx_conf_set_str_array_slot:对多参数处理

ngx_conf_set_keyval_slot:对于key-value类型参数处理

ngx_conf_set_num_slot:针对数字配置处理

这里还有好多,很多都没怎么用过

conf是nginx整体配置域的一个偏移量:

它的取值只有这样3个:

src/http/ngx_http_config.h

#define NGX_HTTP_MAIN_CONF_OFFSET offsetof(ngx_http_conf_ctx_t, main_conf)

#define NGX_HTTP_SRV_CONF_OFFSET offsetof(ngx_http_conf_ctx_t, srv_conf)

#define NGX_HTTP_LOC_CONF_OFFSET offsetof(ngx_http_conf_ctx_t, loc_conf)

ngx_http_conf_ctx_t结构体是这样的,

typedef struct {

void **main_conf;

void **srv_conf;

void **loc_conf;

} ngx_http_conf_ctx_t;

这里的offsetof的一个gcc的一个宏,用来获取结构体内字段在结构体内的偏移量,和之前内核种常见的conten_of是一样的。原理:

#define offsetof(s, m) (size_t)&(((s *)0)->m)

offset是配置字段在配置结构体中的偏移量:

例如我定义了这样一个配置段结构体:

typedef struct {

ngx_str_t xlog_redis;

} ngx_log_redis_loc_conf_t;

那这里对xlog_redis配置的offset值就是offsetof(ngx_log_redis_loc_conf_t, xlog_redis)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: