我們接著上篇文章來講講ngx_get_options函式。
這個函式就在nginx.c檔案中,我們來看看。
引數argc,argv我們在前面的文章中都已經提到了,在這裡我們看ngx_get_options裡面的for迴圈。它的作用就是把所有的執行時引數迴圈一遍,判斷是不是合法。例如 nginx -s stop,nginx -s reload等,如果你只輸入nginx 或者 nginx -s,則會報錯。如果是nginx -h或者-?則是請求幫助資訊。nginx -v則是輸出版本資訊。
好的,我們看main方法裡面接下來的函式ngx_show_version_info。同樣在nginx.c檔案中找到該函式。
這個函式就不多說了,當ngx_show_help = 1的時候就輸出幫助資訊。
接下來,ngx_time_init()。
看函式名字也知道是初始化時間。ngx_time_init () at src/core/ngx_times.c:65,我們到ngx_times.c裡面看看。
前面幾行很簡單,初始化不同快取時間長度。nginx獲取當前時間是通過gettimeofday函式獲取,gettimeofday是c庫提供的函式(不是系統呼叫),它封裝了核心裡的sys_gettimeofday系統呼叫。為避免每次都呼叫os的gettimeofday,nginx採用時間快取,每個worker程序都能自行維護。為控制併發訪問,每次更新時間快取前需申請鎖,而讀時間快取無須加鎖。為避免**讀,即某worker程序讀時間快取過程中接受中斷請求,期間時間快取被其他worker更新,導致前後讀取時間不一致。nginx引入時間快取陣列(共64個成員),每次都更新陣列中的下乙個元素。
我們重點看看ngx_time_update。
ngx_trylock(&ngx_time_lock),更新快取前需獲取ngx_time_lock。
ngx_gettimeofday(&tv),獲取系統時間。
sec = tv.tv_sec;
msec = tv.tv_usec / 1000;
ngx_current_msec = (ngx_msec_t) sec * 1000 + msec;
tp = &cached_time[slot]; –讀當前時間快取
如果快取的時間秒=當前時間秒,直接更新當前slot元素的msec並返回,否則更新下乙個slot陣列元素。
ngx_sprintf讀取所有引數並呼叫ngx_vslprintf,將後續引數以第二個引數的格式複製到p0開始的記憶體區,即給cached_http_time[slot]賦值。
後面的cached_err_log_time[slot] & cached_http_log_time[slot] & cached_http_log_iso8601[slot] & cached_syslog_time[slot]也一樣。
我們來看看ngx_memory_barrier(),禁止編譯器對後面的語句優化。它的作用實際上還是和防止讀操作混亂有關,它告訴編譯器不要將其後面的語句進行優化,不要打亂其執行順序。目的是保證快取時間一致性。
關於時間初始化就到這裡,這裡面還有很多的細節,這裡不進行深入討論。大家可以自己去了解。
nginx原始碼學習
nginx原始碼學習是乙個痛苦又快樂的過程,下面列出了一些nginx的學習資源。看了nginx原始碼,發現這是乙份完全沒有注釋,完全沒有配置文件的 這份注釋版原始碼會不斷進行更新的 好了,第乙個問題,nginx的main函式在 呢?src core nginx.c 第二個問題,nginx啟動的時候都...
nginx原始碼學習(五)程序間的通訊
nginx啟動worker程序的函式主體還是比較簡單的 static void ngx start worker processes ngx cycle t cycle,ngx int t n,ngx int t type for迴圈啟動配置的worker程序個數,下面主要分析兩個函式 ngx sp...
nginx原始碼學習資源
nginx原始碼學習是乙個痛苦又快樂的過程,下面列出了一些nginx的學習資源。看了nginx原始碼,發現這是乙份完全沒有注釋,完全沒有配置文件的 這份注釋版原始碼會不斷進行更新的 好了,第乙個問題,nginx的main函式在 呢?src core nginx.c 第二個問題,nginx啟動的時候都...