• Nginx main()源码分析


      1 int ngx_cdecl
      2 main(int argc, char *const *argv)
      3 {
      4     ngx_buf_t        *b;
      5     ngx_log_t        *log;
      6     ngx_uint_t        i;
      7     ngx_cycle_t      *cycle, init_cycle;
      8     ngx_conf_dump_t  *cd;
      9     ngx_core_conf_t  *ccf;
     10 
     11     ngx_debug_init();
     12 
     13     if (ngx_strerror_init() != NGX_OK) {
     14         return 1;
     15     }
     16 
     17     //解析命令行参数
     18     if (ngx_get_options(argc, argv) != NGX_OK) {
     19         return 1;
     20     }
     21 
     22     //版本???
     23     if (ngx_show_version) {
     24         ngx_show_version_info();
     25 
     26         if (!ngx_test_config) {
     27             return 0;
     28         }
     29     }
     30 
     31     /* TODO */ ngx_max_sockets = -1;
     32 
     33     //初始化并更新时间
     34     ngx_time_init();
     35 
     36 #if (NGX_PCRE)
     37     //PCRE初始化
     38     ngx_regex_init();
     39 #endif
     40 
     41     //获取进程pid
     42     ngx_pid = ngx_getpid();
     43     ngx_parent = ngx_getppid();
     44     
     45     //初始化log
     46     log = ngx_log_init(ngx_prefix);
     47     if (log == NULL) {
     48         return 1;
     49     }
     50 
     51     /* STUB */
     52 #if (NGX_OPENSSL)
     53     ngx_ssl_init(log);
     54 #endif
     55 
     56     /*
     57      * init_cycle->log is required for signal handlers and
     58      * ngx_process_options()
     59      */
     60 
     61     //初始化init_cycle全局变量
     62     ngx_memzero(&init_cycle, sizeof(ngx_cycle_t));
     63     init_cycle.log = log;
     64     ngx_cycle = &init_cycle;
     65 
     66     //初始化内存池
     67     init_cycle.pool = ngx_create_pool(1024, log);
     68     if (init_cycle.pool == NULL) {
     69         return 1;
     70     }
     71     //存储命令行参数到内存池
     72     if (ngx_save_argv(&init_cycle, argc, argv) != NGX_OK) {
     73         return 1;
     74     }
     75 
     76     //存储程序、配置文件的路径以及conf参数
     77     if (ngx_process_options(&init_cycle) != NGX_OK) {
     78         return 1;
     79     }
     80 
     81     //初始化系统相关变量,内存页面大小ngx_pagesize,ngx_cacheline_size,最大连接数ngx_max_sockets等
     82     if (ngx_os_init(log) != NGX_OK) {
     83         return 1;
     84     }
     85 
     86     /*
     87      * ngx_crc32_table_init() requires ngx_cacheline_size set in ngx_os_init()
     88      */
     89 
     90     //初始化循环冗余校验表
     91     if (ngx_crc32_table_init() != NGX_OK) {
     92         return 1;
     93     }
     94 
     95     /*
     96      * ngx_slab_sizes_init() requires ngx_pagesize set in ngx_os_init()
     97      */
     98 
     99     // 初始化ngx_slab的一些参数
    100     ngx_slab_sizes_init();
    101     // ngx_slab_max_size = ngx_pagesize / 2;
    102     // ngx_slab_exact_size = ngx_pagesize / (8 * sizeof(uintptr_t));
    103 
    104     //热启动平滑过渡,继承原来的套接字
    105     if (ngx_add_inherited_sockets(&init_cycle) != NGX_OK) {
    106         return 1;
    107     }
    108 
    109     //初始化模块
    110     // 设置每个module的index和name
    111     if (ngx_preinit_modules() != NGX_OK) {
    112         return 1;
    113     }
    114 
    115     //初始化cycle
    116     cycle = ngx_init_cycle(&init_cycle);
    117     if (cycle == NULL) {
    118         // cycle->log 失效, 只能使用stderr
    119         if (ngx_test_config) {
    120             ngx_log_stderr(0, "configuration file %s test failed",
    121                            init_cycle.conf_file.data);
    122         }
    123 
    124         return 1;
    125     }
    126 
    127     if (ngx_test_config) {
    128         if (!ngx_quiet_mode) {
    129             ngx_log_stderr(0, "configuration file %s test is successful",
    130                            cycle->conf_file.data);
    131         }
    132 
    133         if (ngx_dump_config) {
    134             cd = cycle->config_dump.elts;
    135 
    136             for (i = 0; i < cycle->config_dump.nelts; i++) {
    137 
    138                 ngx_write_stdout("# configuration file ");
    139                 (void) ngx_write_fd(ngx_stdout, cd[i].name.data,
    140                                     cd[i].name.len);
    141                 ngx_write_stdout(":" NGX_LINEFEED);
    142 
    143                 b = cd[i].buffer;
    144 
    145                 (void) ngx_write_fd(ngx_stdout, b->pos, b->last - b->pos);
    146                 ngx_write_stdout(NGX_LINEFEED);
    147             }
    148         }
    149 
    150         return 0;
    151     }
    152 
    153     //处理信号
    154     if (ngx_signal) {
    155         return ngx_signal_process(cycle, ngx_signal);
    156     }
    157 
    158     
    159     ngx_os_status(cycle->log);
    160 
    161     ngx_cycle = cycle;
    162 
    163     //获取核心模块配置文件指针
    164     ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
    165 
    166     if (ccf->master && ngx_process == NGX_PROCESS_SINGLE) {
    167         ngx_process = NGX_PROCESS_MASTER;
    168     }
    169 
    170 #if !(NGX_WIN32)
    171 
    172     if (ngx_init_signals(cycle->log) != NGX_OK) {
    173         return 1;
    174     }
    175 
    176     if (!ngx_inherited && ccf->daemon) {
    177         if (ngx_daemon(cycle->log) != NGX_OK) {
    178             return 1;
    179         }
    180 
    181         ngx_daemonized = 1;
    182     }
    183 
    184     if (ngx_inherited) {
    185         ngx_daemonized = 1;
    186     }
    187 
    188 #endif
    189 
    190     //创建pid文件
    191     if (ngx_create_pidfile(&ccf->pid, cycle->log) != NGX_OK) {
    192         return 1;
    193     }
    194 
    195     if (ngx_log_redirect_stderr(cycle) != NGX_OK) {
    196         return 1;
    197     }
    198 
    199     if (log->file->fd != ngx_stderr) {
    200         if (ngx_close_file(log->file->fd) == NGX_FILE_ERROR) {
    201             ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
    202                           ngx_close_file_n " built-in log failed");
    203         }
    204     }
    205 
    206     ngx_use_stderr = 0;
    207 
    208     //创建子进程
    209     if (ngx_process == NGX_PROCESS_SINGLE) {
    210         ngx_single_process_cycle(cycle);
    211 
    212     } else {
    213         ngx_master_process_cycle(cycle);
    214     }
    215 
    216     return 0;
    217 }
  • 相关阅读:
    Python实现DES加密算法
    空循环,g++ O2优化
    java 高并发下超购问题解决
    原型模式
    Lambda速学
    观察者模式
    略读策略模式
    .net 字典的速学
    执行计划准备篇
    关于“策略模式”与“桥接模式”的问题
  • 原文地址:https://www.cnblogs.com/HadesBlog/p/14498817.html
Copyright © 2020-2023  润新知