在nginx.c中的main函数开始之前定义了一些列的全局性的变量,下面一一介绍每个变量的意义和作用.
以上截图可以看出, nginx.c中定义了以下全局性的变量:
ngx_core_commands: 已经在前面的一篇文章中介绍过。
ngx_core_module_ctx 核心模块上下文:
// ngx_core_module_t是核心模块结构体,包含一个模块名称以及两个指针函数create_conf和init_conf // 具体定义见./src/core/ngx_conf_file.h文件 // 下面是定义全局的核心模块上下文ngx_core_module_ctx static ngx_core_module_t ngx_core_module_ctx = { ngx_string("core"), // 模块名称 ngx_core_module_create_conf, // 创建配置的指针函数 ngx_core_module_init_conf // 初始化配置的指针函数 };
// ngx_core_module_t是核心模块结构体,包含一个模块名称以及两个指针函数create_conf和init_conf typedef struct { ngx_str_t name; void *(*create_conf)(ngx_cycle_t *cycle); char *(*init_conf)(ngx_cycle_t *cycle, void *conf); } ngx_core_module_t;
ngx_core_module 核心模块对象:
// 下面定义核心模块全局变量 ngx_module_t ngx_core_module = { NGX_MODULE_V1, // 前面七个字段使用NGX_MODULE_V1一次性填充起来 &ngx_core_module_ctx, // 模块的上下文, 即上面定义的ngx_core_module_ctx变量 ngx_core_commands, /* module directives */ NGX_CORE_MODULE, /* module type */ NULL, /* init master */ NULL, /* init module */ NULL, /* init process */ NULL, /* init thread */ NULL, /* exit thread */ NULL, /* exit process */ NULL, /* exit master */ NGX_MODULE_V1_PADDING // 填充后面的字段 };核心模块也是ngx_module_t类型, 下面我们仔细看看这个结构体的定义:
// 具体可参见nginx-modules-and-init文件 #define NGX_MODULE_V1 0, 0, 0, 0, 0, 0, 1 //使用这个值初始化模块前面7个字段的值 #define NGX_MODULE_V1_PADDING 0, 0, 0, 0, 0, 0, 0, 0 //使用这个值初始化模块最后面的8个字段的值 struct ngx_module_s { ngx_uint_t ctx_index; //分类模块计数器 ngx_uint_t index; //模块计数器 ngx_uint_t spare0; //替补0 ngx_uint_t spare1; //替补1 ngx_uint_t spare2; ngx_uint_t spare3; ngx_uint_t version; //版本 void *ctx; //该模块的上下文,每个种类的模块有不同的上下文 ngx_command_t *commands; //该模块的命令集,指向一个ngx_command_t结构数组 ngx_uint_t type; //该模块的种类,为core/event/http/mail中的一种 //以下是一些callback函数 ngx_int_t (*init_master)(ngx_log_t *log); //初始化master ngx_int_t (*init_module)(ngx_cycle_t *cycle); //初始化模块 ngx_int_t (*init_process)(ngx_cycle_t *cycle); //初始化工作进程 ngx_int_t (*init_thread)(ngx_cycle_t *cycle); //初始化线程 void (*exit_thread)(ngx_cycle_t *cycle); //退出线程 void (*exit_process)(ngx_cycle_t *cycle); //退出工作进程 void (*exit_master)(ngx_cycle_t *cycle); //退出master uintptr_t spare_hook0; //替补钩子0 uintptr_t spare_hook1; uintptr_t spare_hook2; uintptr_t spare_hook3; uintptr_t spare_hook4; uintptr_t spare_hook5; uintptr_t spare_hook6; uintptr_t spare_hook7; };该结构体前面7个字段都是nginx无符号整型, 分别为分类模块计数器,模块计数器,四个占位替补, 一个版本整数。 一般情况下定义变量初始化的时候都是使用 NGX_MODULE_V1 来填充, 一次性填充7个字段的初始值。
以上为每个新定义ngx_module_t变量时候需要设置的一些域。
上面的回调函数, 个人理解有点类似一些钩子系统, 给你的模块有机会在nginx的每个不同的阶段进行一些特殊的工作处理。 比如在主进程master初始化的时候, 以及主进程退出的时候, 比如可以做模块及的初始化或者清理之类的工作。 这里不一定说的准哈, 还没有看到后面的实现, 暂且把现在的感觉写下来,后续做修改。
最后面又保留8个位的替补, 估计是nginx想留到后面做扩展用的吧? 这8个位一般也使用一个宏来一次性初始化 NGX_MODULE_V1_PADDING.
到这里基本明白了ngx_module_t的结构和含义, 那么回头再看看ngx_core_module的定义, 你会发现它仅仅定义了上下文, 相关的核心命令集, 以及属于核心模块core。
后面的几个全局变量都是比较简单的类型, 这里就不写读后感了。后面研读的过程中遇到再带上一笔。