网站首页 > 技术教程 正文
auto/types/typedef脚本
Nginx 的脚本名称以及变量名称都是非常的直截了当,我们完全可以见名知意,这是我们在写代码的时候要学习借鉴的地方。从这个脚本的名称中我们即可以看到,它的作用就是生成 typedef 声明的。
auto/types/sizeof脚本
参数
ngx_type :类型1
ngx_types :类型2
功能
判断 ngx_type 和 ngx_types 是否存在,根据判断条件生成相应的 typedef 语句。
示例
我们这次先看一下脚本使用的示例,从而全面了解一下这个脚本。
在 auto/unix 脚本中,调用了 auto/types/typedef 脚本,如下:
ngx_type="uint64_t"; ngx_types="u_int64_t"; . auto/types/typedef 复制代码
脚本内容
echo $ngx_n "checking for $ngx_type ...$ngx_c" cat << END >> $NGX_AUTOCONF_ERR ---------------------------------------- checking for $ngx_type END ngx_found=no for ngx_try in $ngx_type $ngx_types do cat << END > $NGX_AUTOTEST.c #include <sys/types.h> #include <signal.h> #include <sys/socket.h> #include <sys/time.h> #include <sys/resource.h> #include <netinet/in.h> $NGX_INCLUDE_INTTYPES_H int main() { $ngx_try i = 0; return 0; } END ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \ -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs" eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1" if [ -x $NGX_AUTOTEST ]; then if [ $ngx_try = $ngx_type ]; then echo " found" ngx_found=yes else echo ", $ngx_try used" ngx_found=$ngx_try fi fi rm -f $NGX_AUTOTEST if [ $ngx_found = no ]; then echo $ngx_n " $ngx_try not found$ngx_c" echo "----------" >> $NGX_AUTOCONF_ERR cat $NGX_AUTOTEST.c >> $NGX_AUTOCONF_ERR echo "----------" >> $NGX_AUTOCONF_ERR echo $ngx_test >> $NGX_AUTOCONF_ERR echo "----------" >> $NGX_AUTOCONF_ERR else break fi done if [ $ngx_found = no ]; then echo echo "$0: error: can not define $ngx_type" exit 1 fi if [ $ngx_found != yes ]; then echo "typedef $ngx_found $ngx_type;" >> $NGX_AUTO_CONFIG_H fi 复制代码
脚本分析
我们按照示例的调用例子进行脚本分析。
1). 首先是向控制台输出信息
我们在前面的文章中分析过 ngx_c 变量,这里不再赘述。
sh echo $ngx_n "checking for $ngx_type ...$ngx_c"
我们在终端上可以看到如下内容:
sh checking for uint64_t ...
2). 向 NGX_AUTOCONF_ERR 中生成内容。
cat << END >> $NGX_AUTOCONF_ERR ---------------------------------------- checking for $ngx_type END END 复制代码
所以,实际上向 NGX_AUTOCONF_ERR 中写入的内容是:
checking for uint64_t 复制代码
从前面的文章到现在,我们可以看出来, Nginx 的每一步都有完善的日志,这对于监控程序的执行流程以及分析错误原因是非常有帮助的。
3). 生成测试程序
ngx_found=no 复制代码
这里首先将 ngx_found 的内容赋值为 no ,这个变量在后面用来表示是否存在我们要检测的数据类型。
接着, auto/types/typedef 脚本通过一个 for 循环遍历传进来的 ngx_type 和 ngx_types ,每次循环处理过程都是一样。我们分析一下这个 for 循环。
对于每次循环,都会根据当前遍历到的变量生成一份测试用的 c 源码,如下:
cat << END > $NGX_AUTOTEST.c #include <sys/types.h> #include <signal.h> #include <sys/socket.h> #include <sys/time.h> #include <sys/resource.h> #include <netinet/in.h> $NGX_INCLUDE_INTTYPES_H int main() { $ngx_try i = 0; return 0; } END 复制代码
实际对于我们示例的情况,第一次循环生成的代码如下:
#include <sys/types.h> #include <signal.h> #include <sys/socket.h> #include <sys/time.h> #include <sys/resource.h> #include <netinet/in.h> #include <inttypes.h> int main() { uint64_t i = 0; return 0; } 复制代码
这个源文件真的是很简单, main 函数中只有一行实际的代码。这行代码的作用很简单:如果 uint64_i 这个类型存在的话,那么这个源文件肯定能编译成功,并且最终生成可以执行的目标文件。我们可以通过检测最终的目标文件是否可以被执行来间接的判断 uint64_t 类型是否存在。
4). 编译上面生成的源文件
ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \ -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs" eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1" 复制代码
上面的 ngx_test 就是一个编译语句,具体内容如下:
gcc -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -o objs/autotest objs/autotest.c 复制代码
紧接着的 eval 语句会执行 ngx_test 的内容,也就是执行编译语句,生成可以执行文件 objs/autotest 。
5). 执行可执行程序
if [ -x $NGX_AUTOTEST ]; then if [ $ngx_try = $ngx_type ]; then # $ngx_type是传给for循环的第一个循环参数。所以如果能够执行到这里,则说明第一个参数$ngx_type代表的类型存在 echo " found" ngx_found=yes else # 如果执行到这里,那么说明$ngx_type代表的变量类型不存在,但是$ngx_types代表的变量类型存在, 这个时候 ngx_found就会被赋值为$ngx_types类型 echo ", $ngx_try used" ngx_found=$ngx_try fi fi 复制代码
nginx 判断如果第 4 步生成的目标文件是是可执行文件 -x $NGX_AUTOTEST ,那么执行该目标文件.
这段代码的详细分析我已经在代码里面进行了注释。
6). 删除目标文件
rm -f $NGX_AUTOTEST 复制代码
Nginx 会在运行完可执行文件之后就将该文件删除,所以实际上我们在 Nginx 的目录中是不能看到这些文件的,它们都是临时文件。
7). 根据上面的执行结果进行错误输出
if [ $ngx_found = no ]; then echo $ngx_n " $ngx_try not found$ngx_c" echo "----------" >> $NGX_AUTOCONF_ERR cat $NGX_AUTOTEST.c >> $NGX_AUTOCONF_ERR echo "----------" >> $NGX_AUTOCONF_ERR echo $ngx_test >> $NGX_AUTOCONF_ERR echo "----------" >> $NGX_AUTOCONF_ERR else # 如果当前的数据类型存在,那么就break,不再进行下面的for循环 break fi 复制代码
如果当前遍历的变量类型并不存在,会进行日志输出。
首先,在控制台上面输出 unit64_t not found (我们假设当前检测的 uint64_t 类型不存在)。
然后,把生成的检测数据类型的 c 源文件以及便一直令保存到 NGX_AUTOCONF_ERR 文件中,便于进行错误分析。
8). 循环结束后的处理
这里要分三种种情况,如下:
① ``ngx_type 和 ngx_types 都不存在。那么执行下面的脚本:
if [ $ngx_found = no ]; then echo echo "$0: error: can not define $ngx_type" exit 1 fi 复制代码
这部分脚本会向控制台输出一行错误信息,告诉 nginx 不能使用当前的变量类型,然后结束脚本。
② ngx_type 存在。如果是这种情况的话, ngx_found 的值是 yes ,这样的话, auto/types/typedef 脚本就直接结束了。
③ ngx_type 类型不存在,但是 ngx_types 存在。这个时候 ngx_found 的值是 ngx_types 的值。所以会执行下面的脚本:
if [ $ngx_found != yes ]; then echo "typedef $ngx_found $ngx_type;" >> $ fi 复制代码
也就是向 NGX_AUTO_CONFIG_H 头文件中生成一个 typedef 语句。如下:
typedef $ngx_types $ngx_type; 复制代码
也即是把 ngx_type 作为 $ngx_types 的别名,这样程序中就可以一直使用 ngx_type 这种类型。
对于本例来说,假设满足第 ③ 种条件的话,就会生成一个如下的 typedef 语句:
typedef u_int64_t uint64_t; 复制代码
到此为止,我们已经分析完了 auto/types/typedef 脚本。
总结
本文详细的分析了 auto/types/sizeof 脚本的功能:测试一个 c 语言数据类型在特定操作系统上的长度,根据长度进行不同的操作。
猜你喜欢
- 2024-10-12 高端Linux 脚本很有用,赶紧学起来!
- 2024-10-12 linux日常脚本(linux有意思的脚本)
- 2024-10-12 彻底搞懂nginx基本使用配置(nginx常用配置参数)
- 2024-10-12 nginx的脚本特性-nginScript笔记(nginx执行lua脚本)
- 2024-10-12 详解shell脚本case条件语句,开发各种服务启动脚本跳板机
- 2024-09-25 详解利用系统函数模拟实现nginx 系统脚本启动的特殊颜色专业效果
- 2024-09-25 0364-如何使用Nginx实现HiveServer2负载均衡
- 2024-09-25 centos 7.9 shell脚本安装nginx-1.20.2
- 2024-09-25 CentOS 开机启动脚本(centos开机启动脚本)
- 2024-09-25 Nginx日志安全分析脚本(nginx日志大量502)
你 发表评论:
欢迎- 最近发表
-
- Win10 TH2正式版官方ESD映像转换ISO镜像方法详解
- 使用iso镜像升级到Windows 10的步骤
- macOS Ventura 13.2 (22D49) Boot ISO 原版可引导镜像
- 安利一个用ISO镜像文件制作引导U盘的的小工具RUFUS
- CentOS 7使用ISO镜像配置本地yum源
- 用于x86平台的安卓9.0 ISO镜像发布下载:通吃I/A/N、完全免费
- AlmaLinux 9.6发布:升级工具、初步支持IBM Power虚拟化技术
- Rufus写入工具简洁介绍与教程(写入模式)
- 新硬件也能安装使用了,Edge版Linux Mint 21.3镜像发布
- 开源工程师:Ubuntu应该抛弃32位ISO镜像
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)