码迷,mamicode.com
首页 > 其他好文 > 详细

Nginx main()源码分析

时间:2021-03-09 13:10:05      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:sizeof   校验   ons   pen   文件的   void   ast   pos   idf   

  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 }

 

Nginx main()源码分析

标签:sizeof   校验   ons   pen   文件的   void   ast   pos   idf   

原文地址:https://www.cnblogs.com/HadesBlog/p/14498817.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!