nginx学习(二)动态加载各模块
其实应该叫做静态加载各模块,因为此加载的过程实际上是在编译的时候完成的,而非运行时根据配置文件动态加载.
假设这样的场景,程序有很多模块,每种模块的配置写在各自的代码中(可能为.cpp,也可能为.h),在调用处只是将其简单申明,然后加载进来,若某一天不需要此模块,只需简单的在调用处屏蔽代码即可.
此代码从nginx代码中抽取,为了简单修改了部分代码,以免引入过多的概念.
1 // ngx_module_load_test.cpp : Defines the entry point for the console application. 2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 using namespace std; 7 8 typedef int intptr_t; 9 typedef unsigned int uintptr_t; 10 typedef unsigned char u_char; 11 12 typedef intptr_t ngx_int_t; 13 typedef uintptr_t ngx_uint_t; 14 15 #define NGX_MODULE_V1 0, 0, 0, 0, 0, 0, 1 16 #define NGX_MODULE_V1_PADDING 0, 0, 0, 0, 0, 0, 0, 0 17 18 typedef struct { 19 size_t len; 20 u_char *data; 21 } ngx_str_t; 22 23 //typedef struct ngx_conf_s ngx_conf_t; 24 struct ngx_command_s { 25 ngx_str_t name; 26 ngx_uint_t type; 27 //char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); 28 ngx_uint_t conf; 29 ngx_uint_t offset; 30 void *post; 31 }; 32 typedef struct ngx_command_s ngx_command_t; 33 34 struct ngx_module_s { 35 ngx_uint_t ctx_index; 36 ngx_uint_t index; 37 38 ngx_uint_t spare0; 39 ngx_uint_t spare1; 40 ngx_uint_t spare2; 41 ngx_uint_t spare3; 42 43 ngx_uint_t version; 44 45 void *ctx; 46 ngx_command_t *commands; 47 ngx_uint_t type; 48 49 uintptr_t spare_hook11; 50 uintptr_t spare_hook12; 51 uintptr_t spare_hook13; 52 uintptr_t spare_hook14; 53 uintptr_t spare_hook15; 54 uintptr_t spare_hook16; 55 uintptr_t spare_hook17; 56 57 uintptr_t spare_hook0; 58 uintptr_t spare_hook1; 59 uintptr_t spare_hook2; 60 uintptr_t spare_hook3; 61 uintptr_t spare_hook4; 62 uintptr_t spare_hook5; 63 uintptr_t spare_hook6; 64 uintptr_t spare_hook7; 65 }; 66 67 typedef struct ngx_module_s ngx_module_t; 68 #define NGX_CORE_MODULE 0x45524F43 /* "CORE" */ 69 // core模块定义处 70 ngx_module_t ngx_core_module = { 71 NGX_MODULE_V1, 72 NULL, /* module context */ 73 NULL, /* module directives */ 74 1, /* module type */ 75 NULL, /* init master */ 76 NULL, /* init module */ 77 NULL, /* init process */ 78 NULL, /* init thread */ 79 NULL, /* exit thread */ 80 NULL, /* exit process */ 81 NULL, /* exit master */ 82 NGX_MODULE_V1_PADDING 83 }; 84 85 // errlog模块定义处 86 ngx_module_t ngx_errlog_module = { 87 NGX_MODULE_V1, 88 NULL, /* module context */ 89 NULL, /* module directives */ 90 2, /* module type */ 91 NULL, /* init master */ 92 NULL, /* init module */ 93 NULL, /* init process */ 94 NULL, /* init thread */ 95 NULL, /* exit thread */ 96 NULL, /* exit process */ 97 NULL, /* exit master */ 98 NGX_MODULE_V1_PADDING 99 }; 100 101 102 103 // 模块引入处 104 ngx_module_t *ngx_modules[] = { 105 &ngx_core_module, //引入core模块 106 &ngx_errlog_module, //引入errlog模块 107 NULL 108 }; 109 110 111 int _tmain(int argc, _TCHAR* argv[]) 112 { 113 //编历加载各模块 114 for (int i = 0; ngx_modules[i]; i++) 115 { 116 cout<<i<<" type:"<<ngx_modules[i]->type<<endl; 117 } 118 return 0; 119 }