微信公众号: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源码分析
)。