在nginx的启动过程中,ngx_init_cycle这个函数做了大部分的初始化工作,而初始化的变量都保存在ngx_cycle_t这个结构体中,为了深入了解这个函数都做了那些初始化工作,就化时间研究了一下,并写下来以便以后参考。
1ngx_cycle_t
关于这个结构体前面已经简单介绍过,这里不再赘述。
2ngx_init_cycle
ngx_cycle_t * ngx_init_cycle(ngx_cycle_t *old_cycle);
先看一下这个old_cycle参数从哪里来的:
ngx_cycle_t *cycle, init_cycle;
init_cycle.pool = ngx_create_pool(1024, log);//创建内存池
if (init_cycle.pool == NULL) {
return 1;
}
......
......
if (ngx_process_options(&init_cycle) != NGX_OK) {
return 1;
}
cycle = ngx_init_cycle(&init_cycle);
可见在调用ngx_int_cycle之前,这个old_cycle已经保存了一些参数,这些参数包括:prefix,conf_prefix,conf_file, conf_para。主要在ngx_process_options这个函数中初始化old_cycle,这个函数比较简单,看一下代码:
static ngx_int_t
ngx_process_options(ngx_cycle_t *cycle)
{
u_char *p;
size_t len;
if (ngx_prefix) {
len = ngx_strlen(ngx_prefix);
p = ngx_prefix;
if (!ngx_path_separator(*p)) {
p = ngx_pnalloc(cycle->pool, len + 1);
if (p == NULL) {
return NGX_ERROR;
}
ngx_memcpy(p, ngx_prefix, len);
p[len++] = '/';
}
cycle->conf_prefix.len = len;
cycle->conf_prefix.data = p;
cycle->prefix.len = len;
cycle->prefix.data = p;
} else {
#ifndef NGX_PREFIX
p = ngx_pnalloc(cycle->pool, NGX_MAX_PATH);
if (p == NULL) {
return NGX_ERROR;
}
if (ngx_getcwd(p, NGX_MAX_PATH) == 0) {//得到当前的工作目录
ngx_log_stderr(ngx_errno, "[emerg]: " ngx_getcwd_n " failed");
return NGX_ERROR;
}
len = ngx_strlen(p);
p[len++] = '/';
cycle->conf_prefix.len = len;
cycle->conf_prefix.data = p;//配置目录
cycle->prefix.len = len;
cycle->prefix.data = p;//安装目录
#else
#ifdef NGX_CONF_PREFIX
ngx_str_set(&cycle->conf_prefix, NGX_CONF_PREFIX);//配置文件相对于安装的目录
#else
ngx_str_set(&cycle->conf_prefix, NGX_PREFIX);
#endif
ngx_str_set(&cycle->prefix, NGX_PREFIX);
#endif
}
if (ngx_conf_file) {
cycle->conf_file.len = ngx_strlen(ngx_conf_file);
cycle->conf_file.data = ngx_conf_file;
} else {
ngx_str_set(&cycle->conf_file, NGX_CONF_PATH);
}
if (ngx_conf_full_name(cycle, &cycle->conf_file, 0) != NGX_OK) {
return NGX_ERROR;
}
for (p = cycle->conf_file.data + cycle->conf_file.len - 1;
p > cycle->conf_file.data;
p--)
{
if (ngx_path_separator(*p)) {
cycle->conf_prefix.len = p - ngx_cycle->conf_file.data + 1;
cycle->conf_prefix.data = ngx_cycle->conf_file.data;
break;
}
}
if (ngx_conf_params) {
cycle->conf_param.len = ngx_strlen(ngx_conf_params);
cycle->conf_param.data = ngx_conf_params;
}
if (ngx_test_config) {
cycle->log->log_level = NGX_LOG_INFO;
}
return NGX_OK;
}
现在开始进入关键:ngx_init_cycle,按照执行步骤来进行
2.1调用ngx_timezone_update()、ngx_timeofday() 、ngx_time_update(0,0)做时间校准
ngx_timezone_update();
/* force localtime update with a new timezone */
tp = ngx_timeofday();
tp->sec = 0;
ngx_time_update();
2.2创建一个新的ngx_cycle_t变量cycle,并且初始化其大部分的成员