在分析nginx源代码时,我们看到几乎所有的源文件都会首先包含ngx_config.h
,ngx_core.h
这两个头文件。这两个头文件又包含一些其他头文件,其他头文件我们主要会介绍ngx_linux_config.h
,ngx_auto_headers.h
和ngx_auto_config.h
这三个。按头文件包含由里到外的顺序为:
如下我们也按这个顺序来进行介绍。
1. ngx_auto_config.h头文件
ngx_auto_config.h
头文件是我们在配置编译时生成的,我们在这里在此列出以作参考:
ngx_auto_config.h
基本上在执行configure脚本时根据当前操作系统的特性所产生的一些配置。
ngx_auto_headers.h
头文件是在执行configure脚本时产生的,主要是检测当前操作系统所支持的一些头文件:
3. os/unix/ngx_linux_config.h头文件
如上我们看到ngx_linux_config.h
头文件也是一个很基础的头文件,参照我们configure执行时的相应特性:
-
NGX_HAVE_POSIX_SEM
: 值为1
-
NGX_HAVE_SYS_PRCTL_H
: 值为1
-
NGX_HAVE_SENDFILE64
: 值为1
-
NGX_HAVE_POLL
: 没有定义,值为0
-
NGX_HAVE_EPOLL
: 值为1
-
NGX_HAVE_SYS_EVENTFD_H
: 值为1
-
NGX_HAVE_FILE_AIO
: 没有定义,值为0
-
NGX_HAVE_SO_SNDLOWAT
: 没有定义
-
NGX_HAVE_INHERITED_NONBLOCK
: 没有定义
extern char **environ
其一般是定义在操作系统posix/environ.c中。该变量在我们可执行程序启动时操作系统就会自动为我们赋值。看如下测试程序test2.c:
编译运行:
[root@localhost test-src]# gcc -o test2 test2.c
[root@localhost test-src]# ./test2
XDG_SESSION_ID=23
HOSTNAME=localhost.localdomain
SELINUX_ROLE_REQUESTED=
TERM=vt100
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.69.1 49180 22
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/2
JRE_HOME=/usr/java/jdk1.8.0_131/jre
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01; //此处部分删减
MAIL=/var/spool/mail/root
PATH=/usr/java/jdk1.8.0_131//bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root/test-src
JAVA_HOME=/usr/java/jdk1.8.0_131/
LANG=en_US.UTF-8
SELINUX_LEVEL_REQUESTED=
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
CLASSPATH=/usr/java/jdk1.8.0_131//lib:/usr/java/jdk1.8.0_131/jre/lib:
SSH_CONNECTION=192.168.69.1 49180 192.168.69.128 22
PKG_CONFIG_PATH=:/usr/local/lib/pkgconfig/
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
_=./test2
OLDPWD=/root
与我们直接调用如下命令得到的结果一致:
# env
4. core/ngx_config.h头文件
-
NGX_LINUX
: 值为1
-
NGX_LINUXTHREADS
: 没有定义
-
NGX_PTR_SIZE
: 值为4
-
NGX_ALIGNMENT
: 没有定义
5. core/ngx_core.h头文件
-
NGX_THREADS
: 没有定义
-
NGX_PCRE
: 值为1
-
NGX_OPENSSL
: 值为1
-
NGX_HAVE_OPENAT
: 值为1