//ctx是個一級指標,以及指標又指向了內部的( 三個並列的) 二級指標,
//所以ctx這裡可以理解為**指標.
在nginx中有個四級指標,void **** conf_ctx,那麼這個四級的指標在什麼情況下用到呢?
答案可以在events block中找到。
在處理events這個指令時,它在conf_ctx中某個地方佔住乙個位置(指標看成陣列),以index代表此處的下標。
在ngx_events_block函式中,先會申請乙個指標,即**中的ctx:
ctx = ngx_pcalloc(cf->pool, sizeof(void *));
這個指標後面就會放到index下標處。那麼這個指標ctx,指向的是什麼呢?那是個陣列,各種event的配置的結構指標陣列,從c語言上看,假設我們用乙個void **tmp的二級指標來指向這個陣列:
tmp = ngx_pcalloc(cf->pool, ngx_event_max_module * sizeof(void *));
*ctx = tmp;
我們看到此時ctx就是乙個指向二級指標的指標,即void ***,而這個ctx又是conf_ctx的乙個成員,很顯然,conf_ctx被冠以void ****也理所當然。
現在的問題是為什麼非要用void ****,void *不可以嗎?從語言層面來說,是可以的。我個人認為,把指標層次寫全,對使用者(或者是**邏輯上層)來說,容易看到它的指向和層次。而寫成void *,那麼只是在實際使用者,根據需要時候來做型別強轉,在其他的地方,看不出它的層次。
以上是我個人的理解,有其他見解的朋友歡迎一起討論。
/// nginx 四級指標 詳解二/
校驗工作完成後,nginx將指令名和所有模組預定義支援的指令進行對比,找到完全匹配的配置指令定義。根據配置指令的不同型別,配置項的儲存位置也不同。
ngx_direct_conf型別的配置指令,其配置項儲存空間是全域性作用域對應的儲存空間。這個型別的指令主要出現在ngx_core_module模組裡。
1 conf = ((void **) cf->ctx)[ngx_modules[i]->index];
ngx_main_conf表示配置指令的作用域為全域性作用域。縱觀nginx整個**,除了ngx_core_module的配置指令(同時標識為ngx_direct_conf)位於這個作用域中外,另外幾個定義新的子級作用域的指令–events、http、mail、imap,都是非ngx_direct_conf的ngx_main_conf指令,它們在全域性作用域中並未被分配空間,所以在指令處理函式中分配的空間需要掛接到全域性作用域中,故傳遞給指令處理函式的引數是全域性作用域的位址。
1 conf = &(((void **) cf->ctx)[ngx_modules[i]->index];
其它型別配置指令項的儲存位置和指令出現的作用域(並且非全域性作用域)有關:
1 confp = *(void **) ((char *) cf->ctx + cmd->conf);
2 if (confp)
配置項將要儲存的位置確定後,呼叫指令處理函式,完成配置項初始化和其它工作。
rc = cmd->set(cf, cmd, conf);
下面通過分析模組http的初始化來進一步加深理解模組的初始化。 關於nginx中的四級指標
在nginx中有個四級指標,void conf ctx,那麼這個四級的指標在什麼情況下用到呢?答案可以在events block中找到。在處理events這個指令時,它在conf ctx中某個地方佔住乙個位置 指標看成陣列 以index代表此處的下標。在ngx events block函式中,先會申...
嚴謹的四級安全控制體系
嚴謹的四級安全控制體系 金和軟體 平台的4層安全體系層層防護 六種復合認證方式保障登入安全 口令認證 asp.net 配置為使用窗體身份驗證,iis配置為匿名訪問,系統將根據資料儲存 資料庫 對呼叫者提供的憑證進行身份驗證 使用 html 窗體 口令認證採用md5加密演算法,128位金鑰加密確保系統...
防禦針對Linux伺服器的四級攻擊
原貼 http www.e gov.org.cn wangluoanquan news004 200709 72087.html 防禦針對linux伺服器的四級攻擊 隨著linux企業應用的擴充套件,有大量的網路伺服器使用linux作業系統。linux伺服器的安全效能受到越來越多的關注,這裡根據li...