ngx_debug_init:
从nginx的main函数进入,首先看到的第一个函数函数是ngx_debug_init(),在ngx_linux_config.h中将它定义为空,所以这个函数是不会执行的,
ngx_strerror_init:
然后是ngx_strerror_init函数,这个函数的作用是初始化ngx_sys_errlist,并将错误号与错误描述符对应放入其中,
ngx_get_options:
然后是ngx_get_option函数,这个函数的作用是取得传给main函数的参数,并根据参数设置全局变量,全局变量包括ngx_show_version,ngx_show_help,ngx_show_configure,ngx_test_config,ngx_quiet_mode,ngx_prefix,ngx_conf_file,ngx_conf_params,ngx_signal,ngx_process,
设置好全局变量后,nginx会根据设置的变量,决定是否显示版本,帮助和配置
ngx_time_init函数:
然后是ngx_time_init函数,在ngx_time_init函数中,首先设置ngx中err_log_time,http_time,http_log_time,http_log_iso8601,syslog_time的长度,
ngx_time_init -> ngx_time_update
然后调用ngx_time_update函数,ngx会调用ngx_trylock首先判断或者ngx_time_lock是否为0(我认为0代表ngx_timelock没上锁),或者然后会调用一段汇编代码(ngx_atomic_cmp_set):
cmpxchgq 0, ngx_time_lock
sete %eax
ngx_atomic_cmp_set判断ngx_time_lock是否对于0,如果为0,将其置1,也就是上锁,
然后ngx调用ngx_gettimeofday(就是调用gettimeofday)取得当前时间,
然后判断当前cached_time与当前时间是否相同,相同则解锁ngx_time_lock并返回,不同则在cached_time数组的下一个位置放入当前时间,
然后调用ngx_gmtime,计算出sec,min,hour,mday,mon,year,wdays,
然后调用ngx_localtime,函数ngx_localtime就是对库函数localtime的封装,
然后ngx会打印err_log_time,http_log_time,http_log_iso8601,syslog_time的时间
这个时候调用ngx_memory_barrier,这个函数调用:
__asm_volatile(:::"memory")
我在网上查到的是告诉编译器,cpu中的register,以及cache中的数据作废
接下来ngx_time_update函数会重新设定err_log_time,http_time,http_log_time,http_log_iso8601,syslog_time中的值,然后解锁ngx_time_lock
然后nginx会使用memset为init_cycle分配内存空间,并将创建好的log赋值给它,然后调用ngx_create_pool分配内存池