nginx原始碼學習(五)

2021-07-30 06:21:29 字數 2355 閱讀 5505

我們接著上篇文章來講講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啟動的時候都...