content
0. 序
1. core模組的配置結構
2. create_conf分析
3. init_conf分析
4. 小結
0. 序
在原始碼分析—全域性變數
ngx_cycle
的初始化
>
中,簡單介紹了如何呼叫
core
模組的callback
,並簡單列出其定義及其初始化,本文將重點闡述
callback
做什麼。
1. core模組的配置結構
如前文所述,
core
模組的callback
有兩個create_conf()
和init_conf()
,從名字就可以看出,乙個建立配置結構,另乙個初始化該配置結構。
core
模組的配置結構如下,存放配置檔案中的核心指令,如
deamon
,master等。
./src/core/ngx_cycle.h
[cpp]view plain
copy
typedef
struct ngx_core_conf_t;
2. create_conf分析
create_conf
只是指標,
core
模組的create_conf
指向ngx_core_module_init_conf
()函式,該函式建立
ngx_core_conf_t
配置結構。
[cpp]view plain
copy
static
void *
ngx_core_module_create_conf(ngx_cycle_t *cycle)
/** set by ngx_pcalloc()
** ccf->pid = null;
* ccf->oldpid = null;
* ccf->priority = 0;
* ccf->cpu_affinity_n = 0;
* ccf->cpu_affinity = null;
*/ccf->daemon = ngx_conf_unset;
ccf->master = ngx_conf_unset;
ccf->timer_resolution = ngx_conf_unset_msec;
ccf->worker_processes = ngx_conf_unset;
ccf->debug_points = ngx_conf_unset;
ccf->rlimit_nofile = ngx_conf_unset;
ccf->rlimit_core = ngx_conf_unset;
ccf->rlimit_sigpending = ngx_conf_unset;
ccf->user = (ngx_uid_t) ngx_conf_unset_uint;
ccf->group = (ngx_gid_t) ngx_conf_unset_uint;
#if (ngx_threads)
ccf->worker_threads = ngx_conf_unset;
ccf->thread_stack_size = ngx_conf_unset_size;
#endif
if (ngx_array_init(&ccf->env, cycle->pool, 1, sizeof(ngx_str_t))
!= ngx_ok)
return ccf;
}
該函式很簡單,即將配置結構的各個字段初始化為未設定的值。如下。
[cpp]view plain
copy
#define ngx_conf_unset -1
#define ngx_conf_unset_uint (ngx_uint_t) -1
#define ngx_conf_unset_ptr (void *) -1
#define ngx_conf_unset_size (size_t) -1
#define ngx_conf_unset_msec (ngx_msec_t) -1
3. init_conf分析
init_conf才是真正的初始化該結構。
(1) 初始化daemon、master等
直接賦值。
(2) 初始化pid、oldpid
呼叫ngx_conf_full_name()函式初始化pid,實際上就是在pid字串前加上ngx_prefix獲取pid全路徑,ngx_prefix定義如下。
[cpp]view plain
copy
#ifndef ngx_prefix
#define ngx_prefix "/usr/local/nginx/"
#endif
例如,ngx_conf_full_name()被呼叫前ccf->pid的內容如下。
[plain]view plain
copy
(gdb) p ccf->pid
$2 =
ngx_conf_full_name
()被呼叫後
ccf->pid
的內容如下。
[plain]view plain
copy
(gdb) p ccf->pid
$3 =
(3)初始化username,user,group
該初始化通過呼叫系統函式
getpwnam()
和getgrnam()
完成。相關資料結構如下。
the getpwnam() function returns a pointer to a structure containing the broken-out fields of the record in the password database (e.g., the local password file /etc/passwd, nis, and ldap) that matches the username name.
the passwd structure is defined in as follows:
struct passwd ;
the getgrnam() function returns a pointer to a structure containing the broken-out fields of the record in the group database (e.g., the local group file /etc/group, nis, and ldap) that matches the group name name.
the group structure is defined in as follows:
struct group ;
獲得的資料如下。
[plain]view plain
copy
(gdb) p *pwd
$5 =
(gdb) p *grp
$6 =
(4) 初始化lock_file
同初始化pid,呼叫ngx_conf_full_name()函式初始化lock_file,即在lock_file字串前加上ngx_prefix獲取其全路徑,其全路徑如下。
[plain]view plain
copy
(gdb) p ccf->lock_file
$6 =
(5) 初始化ngx_cycle->lock_file
ngx_cycle->lock_file的初始化是複製ccf->lock_file的內容並在其後鏈結".accept"。
(6) ngx_cpymem與ngx_memcpy
ngx_cpymem(dst,src,n):將src內容拷貝n個到dst,且返回位址dst+n
ngx_memcpy(dst,src,n):將src內容拷貝n個到dst
(7) 配置結構初始化後的內容
跟蹤除錯即可獲得ngx_core_module這個core模組的配置結構,如下。
[plain]view plain
copy
(gdb) p *ccf
$12 = ,
lock_file = ,
pid = ,
oldpid = ,
env = ,
environment = 0x0
}
4. 小結
本文主要分析
core
模組的callback
,後文繼續分析配置檔案解析等。
閱讀、分析優秀的開源**,一定要親自操刀執行、除錯,才能深刻理解呼叫路徑,資料流向。當然筆者還沒有開始分析
nginx
的核心功能**,我想那將是非常享受的**之旅。
reference
# man getpwnam
# man getgrnam
Spring Beans模組原始碼分析
spring beans模組是spring三大核心模組 spring beans,spring core,spring context 之一,bean 在 spring 中作用就像 object 對 oop 的意義一樣,沒有物件的概念就像沒有物件導向程式設計,spring 中沒有 bean 也就沒有...
qgis原始碼學習2之core模組的raster
由圖可以看出raster模組還是比較孤立的不依賴於其他的模組,第二個就選它了。1.qgsrasterresampler是乙個基類用來在不同的qimage中重新取樣。它的所有的成員函式都是虛函式。class qgsrasterresampler virtual void resample const ...
Zepto原始碼分析 deferred模組
原始碼注釋 zepto.js c 2010 2015 thomas fuchs may be freely distributed under the mit license.some code c 2005,2013 jquery foundation,inc.and other contribu...