nginx.c中的全局变量分析
来源:互联网 发布:php导出excel表格下载 编辑:程序博客网 时间:2024/06/05 05:55
在nginx.c中的main函数开始之前定义了一些列的全局性的变量,下面一一介绍每个变量的意义和作用.
以上截图可以看出, nginx.c中定义了以下全局性的变量:
- ngx_core_commands : 核心指令集变量
- ngx_core_module_ctx : 核心模块上下文变量
- ngx_core_module : 核心模块变量
- ngx_show_help : 无符号整型, 标记是否显示帮助
- ngx_show_version : 无符号整数, 标记是否显示帮助
- ngx_show_configure : 无符号整数, 标记是否显示配置
- ngx_prefix : 字符串, nginx前缀
- ngx_conf_file : 字符串,保存nginx配置文件字符串
- ngx_conf_params : 字符串, 保存nginx配置的参数, 应该是来自命令行的参数
- ngx_signal : 信号字符串
- ngx_os_environ : nginx操作系统的信息
ngx_core_commands: 已经在前面的一篇文章中介绍过。
ngx_core_module_ctx 核心模块上下文:
// ngx_core_module_t是核心模块结构体,包含一个模块名称以及两个指针函数create_conf和init_conf// 具体定义见./src/core/ngx_conf_file.h文件// 下面是定义全局的核心模块上下文ngx_core_module_ctxstatic 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的定义:
// ngx_core_module_t是核心模块结构体,包含一个模块名称以及两个指针函数create_conf和init_conftypedef 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个字段的初始值。
- ctx : 模块上下文, 每个种类的模块有不同的上下文
- commands : 该模块对应的命令集, 指向ngx_command_t结构体数组
- type : 模块的类型, 为core, event, http或mail中的一种。
- init_master : 初始化master的时候的回调函数
- init_module : 初始化该模块的时候的回调函数
- init_process : 初始化进程的时候的回调函数
- init_thread : 初始化线程的回调函数
- exit_thread : 退出线程的回调函数
- exit_process : 退出工作进程的回调函数
- exit_master: 退出master的回调函数
以上为每个新定义ngx_module_t变量时候需要设置的一些域。
上面的回调函数, 个人理解有点类似一些钩子系统, 给你的模块有机会在nginx的每个不同的阶段进行一些特殊的工作处理。 比如在主进程master初始化的时候, 以及主进程退出的时候, 比如可以做模块及的初始化或者清理之类的工作。 这里不一定说的准哈, 还没有看到后面的实现, 暂且把现在的感觉写下来,后续做修改。
最后面又保留8个位的替补, 估计是nginx想留到后面做扩展用的吧? 这8个位一般也使用一个宏来一次性初始化 NGX_MODULE_V1_PADDING.
到这里基本明白了ngx_module_t的结构和含义, 那么回头再看看ngx_core_module的定义, 你会发现它仅仅定义了上下文, 相关的核心命令集, 以及属于核心模块core。
后面的几个全局变量都是比较简单的类型, 这里就不写读后感了。后面研读的过程中遇到再带上一笔。
- nginx.c中的全局变量分析
- 关于C语言中的局部变量和全局变量的分析
- nginx全局变量
- Nginx 全局变量
- nginx全局变量
- nginx 全局变量
- nginx全局变量
- Nginx全局变量
- nginx 全局变量
- nginx 全局变量
- Nginx全局变量
- nginx源码分析—全局变量ngx_cycle的初始化
- nginx源码分析—全局变量ngx_cycle的初始化
- nginx源码分析—全局变量ngx_cycle的初始化
- nginx源码分析—全局变量ngx_cycle的初始化
- nginx源码分析—全局变量ngx_cycle的初始化
- Nginx源码分析 - 主流程篇 - 全局变量cycle初始化
- 汇编文件调用c中的全局变量
- Ubuntu下tar命令详解使用
- linux常用命令100个用法
- CMD生成文件夹目录结构
- Maven内置变量说明
- linux 下大量TIME_WAIT 的处理
- nginx.c中的全局变量分析
- Unity3d之截图方法
- Web App开发入门
- MySql查询缓存机制
- hibernate利用@DynamicInsert和@DynamicUpdate生成动态SQL语句
- java.lang.IllegalArgumentException: wrong number of arguments
- android requestWindowFeature(featrueId)
- Android WebView的简单使用方法
- 用SQL向表中添加一个字段