Nginx源碼分析之-auto/types/value和auto/types/uintptr_t

微信公衆號: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_tauto/types/value
    下面開始咱們的表演:

auto/types/uintptr_t 腳本

這個腳本的做用是判斷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"
複製代碼

上面的腳本中exprshell中數值計算的命令,因此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/types/value 腳本

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源碼分析)。



喜歡本文的朋友們,歡迎長按下圖關注訂閱號Nginx源碼分析,更多精彩內容第一時間送達
Nginx源碼分析
Nginx源碼分析
相關文章
相關標籤/搜索