微信公衆號:Nginx源碼分析
關注可瞭解更多的Nginx
知識。任何問題或建議,請公衆號留言;
關注公衆號,有趣有內涵的文章第一時間送達!nginx
在上週分析過了auto/types/typedef
腳本,以及auto/types/sizeof
腳本。咱們簡單的回憶一下這兩個腳本的做用:web
auto/types/typedef
: 判斷數據類型是否存在,若是不存在則生成相應的typedef
語句。auto/types/sizeof
:判斷特定操做系統上某個數據類型的長度,而後把獲取的長度寫入到c
源文件中(經過auto/types/value
腳本,咱們稍後就會分析這個腳本).auto/types
中剩餘的兩個腳本:auto/types/uintptr_t
和auto/types/value
。這個腳本的做用是判斷uintptr_t
類型是否存在,若是不存在,那麼根據其餘條件生成相應的tyepdef
語句。Talk is cheap, show me you code
,多說無益,直接擼代碼。shell
無,此腳本沒有輸入參數bash
判斷uintptr_t
類型是否存在。若是不存在的話,生成相應的typedef
微信
下面是該腳本的內容:app
1echo $ngx_n "checking for uintptr_t ...$ngx_c"
2echo >> $NGX_ERR
3echo "checking for uintptr_t" >> $NGX_ERR
4
5found=no
6
7cat << END > $NGX_AUTOTEST.c
8
9#include <sys/types.h>
10$NGX_INTTYPES_H
11
12int main() {
13 uintptr_t i = 0;
14 return 0;
15}
16
17END
18
19eval "$CC -o $NGX_AUTOTEST $NGX_AUTOTEST.c >> $NGX_ERR 2>&1"
20
21if [ -x $NGX_AUTOTEST ]; then
22 echo " uintptr_t found"
23 found=yes
24else
25 echo $ngx_n " uintptr_t not found" $ngx_c
26fi
27
28rm $NGX_AUTOTEST*
29
30
31if [ $found = no ]; then
32 found="uint`expr 8 \* $ngx_ptr_size`_t"
33 echo ", $found used"
34
35 echo "typedef $found uintptr_t;" >> $NGX_AUTO_CONFIG_H
36 echo "typedef $found intptr_t;" | sed -e 's/u//g' >> $NGX_AUTO_CONFIG_H
37fi
複製代碼
1).
首先是向控制檯輸出信息源碼分析
1 echo $ngx_n "checking for uintptr_t ...$ngx_c"
複製代碼
咱們在終端上能夠看到以下內容:
sh checking for uintptr_t ...
ui
2).
向NGX_AUTOTEST
中生成內容。spa
1cat << END > $NGX_AUTOTEST.c
2
3#include <sys/types.h>
4$NGX_INTTYPES_H
5
6int main() {
7 uintptr_t i = 0;
8 return 0;
9}
10
11END
複製代碼
這裏其實生成了一個c
源文件,咱們能夠輸出這個源文件的內容看一下,以下:操作系統
1#include <sys/types.h>
2#include <inttypes.h>
3
4int main() {
5 uintptr_t i = 0;
6 return 0;
7}
複製代碼
咱們看到這個c
源文件其實並無任何的實質性的功能代碼,只有一條變量聲明和賦值語句,功能很是簡單。若是uintptr_t
類型存在的話,那麼這個c
源文件是能夠被成功編譯而且執行的,若是該類型不存在,那麼編譯的時候就會出錯。
3).
編譯上面生成的源文件
1eval "$CC -o $NGX_AUTOTEST $NGX_AUTOTEST.c >> $NGX_ERR 2>&1"
複製代碼
咱們已經在前面的文章中介紹了不少次這行代碼的功能。若是不懂得話,能夠看看前面幾篇文章。
4).
執行可執行程序
1if [ -x $NGX_AUTOTEST ]; then
2 echo " uintptr_t found"
3 found=yes
4else
5 echo $ngx_n " uintptr_t not found" $ngx_c
6fi
複製代碼
若是編譯後成功,那麼說明uintptr_t
類型是存在的。found
變量的值就會被設置爲yes
.
5).
刪除目標文件
1rm -f $NGX_AUTOTEST
複製代碼
Nginx
會在運行完可執行文件以後就將該文件刪除,因此實際上咱們在Nginx
的目錄中是不能看到這些文件的,它們都是臨時文件。
6).
若是類型不存在的話,怎麼辦?
這裏面牽涉到一個變量ngx_ptr_size
變量。咱們先瞅瞅這個變量是幹啥滴。
在auto/unix
文件中,有以下代碼:
1ngx_type="void *"; . auto/types/sizeof; ngx_ptr_size=$ngx_size
複製代碼
根據咱們前面分析的auto/types/sizeof
腳本能夠知道ngx_ptr_size
的值就是 sizeof(void *)
的值。在我本身的Centos
上面,這個值是8
.
下面咱們就看看auto/types/uintptr_t
中如何處理這種狀況的。
1if [ $found = no ]; then
2 found="uint`expr 8 \* $ngx_ptr_size`_t"
3 echo ", $found used"
4
5 echo "typedef $found uintptr_t;" >> $NGX_AUTO_CONFIG_H
6 echo "typedef $found intptr_t;" | sed -e 's/u//g' >> $NGX_AUTO_CONFIG_H
7fi
複製代碼
若是 found = no
的話,就說明uintptr_t
類型不存在,那麼應該咋辦呢?
首先咱們看一下found
的賦值。
1found="uint`expr 8 \* $ngx_ptr_size`_t"
複製代碼
上面的腳本中expr
是shell
中數值計算的命令,因此expr 8 \* $ngx_ptr_size
就是 64
(對於我本身的Centos
,不一樣的宿主計算機,該值可能不一樣)。因此found
的值爲uint64_t
。
緊接着會生成兩個typedef
語句。
1echo "typedef $found uintptr_t;" >> $NGX_AUTO_CONFIG_H
複製代碼
這裏就是向auto_config.h
文件中寫入:
1typedef uint64_t uintptr_t;
複製代碼
而另外一條腳本:
1echo "typedef $found intptr_t;" | sed -e 's/u//g' >> $NGX_AUTO_CONFIG_H
複製代碼
這行腳本則是寫入以下語句:
1typedef int64_t intptr_t;
複製代碼
腳本中的sed
語句是把全部的字母u
替換爲空。因此最終就是上面的代碼。
到此爲止,咱們已經分析完了auto/types/uintptr_t
腳本。
向auto_config.h
文件中define
一些變量。
ngx_param
: define
的變量名ngx_value
: define
的變量值
在auto_config.h
文件中,生成一條define
語句。
其中名稱就是ngx_param
,值就是ngx_value
。
這個腳本不少狀況下都是和auto/types/sizeof
腳本一塊兒使用,前者獲得一些變量的值,後者把值寫入到c
的源文件中。
咱們在auto/unix
中找到了一個例子,以下:
1ngx_type="void *"; . auto/types/sizeof; ngx_ptr_size=$ngx_size
2ngx_param=NGX_PTR_SIZE; ngx_value=$ngx_size; . auto/types/value
複製代碼
這個例子就是上面分析auto/types/uintptr_t
腳本時提到的ngx_ptr_size
變量。
第一行腳本獲得void *
的長度,保存到ngx_size
變量中。
第二行腳本將變量的值寫入到auto_config.h
中。
1cat << END >> $NGX_AUTO_CONFIG_H
2
3#ifndef $ngx_param
4#define $ngx_param $ngx_value
5#endif
6
7END
複製代碼
咱們以示例中的代碼分析這個腳本。
1ngx_param=NGX_PTR_SIZE; ngx_value=$ngx_size; . auto/types/value
複製代碼
假設ngx_size
的值是8
,那麼最終在auto_config.h
文件中就會生成以下的define
代碼:
1#ifndef NGX_PTR_SIZE
2#define NGX_PTR_SIZE 8
3#endif
複製代碼
這個腳本很簡單,咱們就粗略的分析一下。
到此爲止,咱們已經分析了auto/types
中的全部腳本,如今簡單的總結一下這幾個腳本的做用。auto/types/sizeof
:判斷一個變量類型的長度。auto/types/typedef
:判斷指定變量類型是否存在,生成相應的typedef
代碼。auto/types/uintptr_t
:判斷uintptr_t
類型是否存在。auto/types/values
:向auto_config.h
文件中自動生成define
語句。
後面的文章咱們會接着分析nginx
的源碼,敬請期待。順便關注個人個公衆號(Nginx源碼分析
)。