zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Linux应急响应(三):挖矿病毒
    Linux应急响应(二):捕捉短连接
    Linux应急响应(一):SSH暴力破解
    Window应急响应(四):挖矿病毒
    Window应急响应(三):勒索病毒
    Window应急响应(二):蠕虫病毒
    openresty开发系列10--openresty的简单介绍及安装
    openresty开发系列4--nginx的配置文件说明
    openresty开发系列3--nginx的平滑升级
    openresty开发系列2--nginx的简单安装,正向、反向代理及常用命令和信号控制介绍
  • 原文地址:https://www.cnblogs.com/luhouxiang/p/2693632.html
Copyright © 2011-2022 走看看