ngx原始碼分析 core模組以及callback

2021-06-20 21:14:55 字數 4754 閱讀 3333

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...