Nginx源碼分析之--auto/endianness腳本

微信公衆號:Nginx源碼分析
關注可瞭解更多的Nginx知識。任何問題或建議,請公衆號留言;
關注公衆號,有趣有內涵的文章第一時間送達!web

斷更說明

前兩週換工做,在準備面試的各類資料,各類頭疼啊~~~
從本週開始,繼續更新……面試

本節簡介

本節咱們分析一下auto/endianness腳本。bash

大端和小端

在分析這個腳本以前,咱們先看一個內容,大端小端,這兩個名詞是用於表示硬件的字節序
顧名思義,就是表示字節的保存順序。
對於一個多字節的數據,好比0x1234,它的高字節是0x12,低字節是0x34,在硬件中有兩種表示方法,以下:
微信

大端法和小端法
大端法和小端法

大端法:高位字節在前(低地址),低位字節在後(高地址),咱們從低地址向高地址閱讀出來的數值,就是咱們保存的數值。app

小端法:低位字節在前,高位字節在後,intel處理器就是典型的小端法。和咱們正常的閱讀方向是相反的。源碼分析

auto/endianness腳本

該腳本用於檢測當前的計算機硬件是大端仍是小端測試

腳本內容

這個腳本的內容以下:ui

 1echo $ngx_n "checking for system byte ordering ...$ngx_c"
2
3cat << END >> $NGX_AUTOCONF_ERR
4
5----------------------------------------
6checking for system byte ordering
7
8END
9
10
11cat << END > $NGX_AUTOTEST.c
12
13int main(void) 
{
14    int i = 0x11223344;
15    char *p;
16
17    p = (char *) &i;
18    if (*p == 0x44return 0;
19    return 1;
20}
21
22END
23
24ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \
25          -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs"

26
27eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"
28
29if [ -x $NGX_AUTOTEST ]; then
30    if $NGX_AUTOTEST >/dev/null 2>&1; then
31        echo " little endian"
32        have=NGX_HAVE_LITTLE_ENDIAN . auto/have
33    else
34        echo " big endian"
35    fi
36
37    rm -rf $NGX_AUTOTEST*
38
39else
40    rm -rf $NGX_AUTOTEST*
41
42    echo
43    echo "$0: error: cannot detect system byte ordering"
44    exit 1
45fi
複製代碼

腳本分析

1) 向終端和NGX_AUTOCONF_ERR輸出內容,表示當前正在進行大小端的檢測spa

1echo $ngx_n "checking for system byte ordering ...$ngx_c"
2
3cat << END >> $NGX_AUTOCONF_ERR
4
5----------------------------------------
6checking for system byte ordering
7
8END
複製代碼

2) 生成檢測程序指針

1int main(void) {
2    int i = 0x11223344;
3    char *p;
4
5    p = (char *) &i;
6    if (*p == 0x44return 0;
7    return 1;
8}
複製代碼

這段程序很簡單。變量i是多字節,指針p執行了變量i的低位字節,若是*p44,那麼表示當前的硬件是大端法,反之爲小端法

3) 編譯測試程序, 生成可執行文件

1ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \
2          -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs"

3
4eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"
複製代碼

4) 執行可執行程序,並作各類判斷.
我在代碼裏面添加了註釋,請參考代碼內容。

 1if [ -x $NGX_AUTOTEST ]; then
2     # 若是返回值是1,表示小端法,這個時候要向NGX_AUTO_CONFIG_H中寫入宏定義
3    if $NGX_AUTOTEST >/dev/null 2>&1; then
4        echo " little endian"
5        have=NGX_HAVE_LITTLE_ENDIAN . auto/have
6    else
7    # 若是返回0,表示是大端法
8        echo " big endian"
9    fi
10# 刪除測試文件以及編譯以後的文件
11    rm -rf $NGX_AUTOTEST*
12
13else
14    rm -rf $NGX_AUTOTEST*
15
16    echo
17    echo "$0: error: cannot detect system byte ordering"
18    exit 1
19fi
複製代碼

總結

auto/endianness用於檢測當前的機器是大端仍是小端。代碼邏輯很是清晰,一看就懂。
若是喜歡本文,請關注公衆號"Nginx源碼分析"



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