Open chunpu opened 9 years ago
set函数就是上一篇提到的很重要的函数之一, 是command命令结构体中的第三个参数.在读取命令时候触发的回调函数.
set是一个函数指针, 原型是这样的.
char * (*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
char *, 返回值可以是NGX_CONF_OK, 或者NGX_CONF_ERROR. 也就是0或者-1的指针.
char *
ngx_conf_t *cf含义未知
ngx_conf_t *cf
ngx_command_t *cmd 表示自己所在的那个command结构体
ngx_command_t *cmd
void *conf 当然是空
void *conf
ngx_http_core_loc_conf_t *corecf; corecf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); corecf->handler = handler;
corecf为何物?, 其实就是读到test命令时的配置状态, corecf是一个巨大的结构体, name属性是"/test", 也就是我们定义的那个路径.后面还有regex等属性, 应该也是用来匹配路径的.
corecf
应该可以猜测, 给corecf的handler属性赋值后, 如果请求的路径匹配corecf的name或者正则等, 就会触发我们挂载的handler函数.
挂完后返回NGX_CONF_OK即可.
NGX_CONF_OK
set在ngx_conf_handler.c文件在ngx_int_t ngx_conf_handler(ngx_conf_t *cf, ngx_int_t last)函数中被调用.
ngx_conf_handler.c
ngx_int_t ngx_conf_handler(ngx_conf_t *cf, ngx_int_t last)
显然set函数的第一个参数cf就是这个大函数中的第一个参数.
第二个参数cmd, 是每一个模块的cmd, 在gdb中print每个模块的cmd, 可以发现daemon, error_log都是command.
ngx_conf_handler函数的作用就是遍历所有模块, 然后带着cf和cmd参数触发cmd的set函数,仅此而已.
ngx_conf_handler
set函数就是上一篇提到的很重要的函数之一, 是command命令结构体中的第三个参数.在读取命令时候触发的回调函数.
set是一个函数指针, 原型是这样的.
返回值
char *
, 返回值可以是NGX_CONF_OK, 或者NGX_CONF_ERROR. 也就是0或者-1的指针.参数
ngx_conf_t *cf
含义未知ngx_command_t *cmd
表示自己所在的那个command结构体void *conf
当然是空如何在set函数中挂上handler
corecf
为何物?, 其实就是读到test命令时的配置状态, corecf是一个巨大的结构体, name属性是"/test", 也就是我们定义的那个路径.后面还有regex等属性, 应该也是用来匹配路径的.应该可以猜测, 给corecf的handler属性赋值后, 如果请求的路径匹配corecf的name或者正则等, 就会触发我们挂载的handler函数.
挂完后返回
NGX_CONF_OK
即可.源代码中如何调用set函数
set在
ngx_conf_handler.c
文件在ngx_int_t ngx_conf_handler(ngx_conf_t *cf, ngx_int_t last)
函数中被调用.显然set函数的第一个参数cf就是这个大函数中的第一个参数.
第二个参数cmd, 是每一个模块的cmd, 在gdb中print每个模块的cmd, 可以发现daemon, error_log都是command.
ngx_conf_handler
函数的作用就是遍历所有模块, 然后带着cf和cmd参数触发cmd的set函数,仅此而已.