微信公衆號:Nginx源碼分析
關注可瞭解更多的Nginx
知識。任何問題或建議,請公衆號留言;
關注公衆號,有趣有內涵的文章第一時間送達!web
前兩週換工做,在準備面試的各類資料,各類頭疼啊~~~
從本週開始,繼續更新……面試
本節咱們分析一下auto/endianness
腳本。bash
在分析這個腳本以前,咱們先看一個內容,大端
和小端
,這兩個名詞是用於表示硬件的字節序
。
顧名思義,就是表示字節的保存順序。
對於一個多字節的數據,好比0x1234
,它的高字節是0x12
,低字節是0x34
,在硬件中有兩種表示方法,以下:
微信
大端法:高位字節在前(低地址),低位字節在後(高地址),咱們從低地址向高地址閱讀出來的數值,就是咱們保存的數值。app
小端法:低位字節在前,高位字節在後,intel
處理器就是典型的小端法
。和咱們正常的閱讀方向是相反的。源碼分析
該腳本用於檢測當前的計算機硬件是大端
仍是小端
。測試
這個腳本的內容以下: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 == 0x44) return 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 == 0x44) return 0;
7 return 1;
8}
複製代碼
這段程序很簡單。變量i
是多字節,指針p
執行了變量i
的低位字節,若是*p
是44
,那麼表示當前的硬件是大端法
,反之爲小端法
。
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源碼分析
,更多精彩內容第一時間送達