继上次的进度,我们应该看的是ngx_process_options函数了,该函数定义在core文件夹当中的nginx.c文件中

//该函数主要作用是将配置文件的路径,系统运行路径,还有用户输入参数保存在cycle结构体当中
static ngx_int_t
ngx_process_options(ngx_cycle_t *cycle)
{
u_char *p;
size_t len;

if (ngx_prefix) {
//ngx_prefix是用户指定的nginx系统所在目录名称,接下来是检测该路径是否格式正确,并且将该路径放在conf_prefix和prefix当中
//-p之后的命令
len = ngx_strlen(ngx_prefix);
p = ngx_prefix;
//ngx_path_separator函数定义在/src/os/unix/ngx_files.h当中,该重定义检测p[len-1]是不是字符'/'
if (len && !ngx_path_separator(p[len - 1])) {
//如果len不是0,而且p[len-1]字符不是'/'
// ngx_pnalloc函数定义在/src/core/ngx_palloc.c,返回内存池链中可用数据大小的ngx_pool_t结构体,
p = ngx_pnalloc(cycle->pool, len + 1);
if (p == NULL) {
return NGX_ERROR;
}
//同时将前缀放在内存池中
ngx_memcpy(p, ngx_prefix, len);
p[len++] = '/';
}
//将该前缀放在cycle当中
cycle->conf_prefix.len = len;
cycle->conf_prefix.data = p;
cycle->prefix.len = len;
cycle->prefix.data = p;

} else {

#ifndef NGX_PREFIX
//如果用户没有指定nginx路径的话,则查看NGX_PREFIX是否定义了,如果没有定义,则将程序当前运行目录设置成conf_prefix和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++] = '/';
//如果ngx_prefix是空的,那么我们会将当前目录作为启动项
cycle->conf_prefix.len = len;
cycle->conf_prefix.data = p;
cycle->prefix.len = len;
cycle->prefix.data = p;

#else

#ifdef NGX_CONF_PREFIX
//如果用户既未指定运行目录,但是指定了NGX_CONF_PREFIX的话,也定义了NGX_PREFIX,则将conf_prefix设置成NGX_CONF_PREFIX
ngx_str_set(&cycle->conf_prefix, NGX_CONF_PREFIX);
#else
//如果用户没有定义NGX_CONF_PREFIX,但是定义了NGX_PREFIX
ngx_str_set(&cycle->conf_prefix, NGX_PREFIX);
#endif
//用户定义了NGX_PREFIX
ngx_str_set(&cycle->prefix, NGX_PREFIX);

#endif
}

if (ngx_conf_file) {
//将从用户输入的-c之后的参数中读取到的配置信息保存在cycle->conf_file当中
cycle->conf_file.len = ngx_strlen(ngx_conf_file);
cycle->conf_file.data = ngx_conf_file;

} else {
//如果用户没有指定-c参数,也就是没有指定配置文件路径,则需要将系统默认的NGX_CONF_PATH,默认是在ngx_prefix之后的/conf/nginx.conf文件
ngx_str_set(&cycle->conf_file, NGX_CONF_PATH);
}
//ngx_conf_full_name函数是定义在/src/core/ngx_conf_file.c
if (ngx_conf_full_name(cycle, &cycle->conf_file, 0) != NGX_OK) {
return NGX_ERROR;
}
//执行到此说明cycle->ngx_conf_file已经是绝对路径了
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) {
//如果用户指定了-g参数则将参数保存下来
cycle->conf_param.len = ngx_strlen(ngx_conf_params);
cycle->conf_param.data = ngx_conf_params;
}

if (ngx_test_config) {
//如果用户输入了-t参数,则将cycle->log->log_level设置成NGX_LOG_INFO即可
cycle->log->log_level = NGX_LOG_INFO;
}

return NGX_OK;
}


接下来就是

if (ngx_os_init(log) != NGX_OK) {
return 1;
}

明天继续...