分析nginx源码

    技术2025-01-07  9

    我们开始真正的分析nginx源码。我并没有一个准确的先后顺序,想到哪就写到哪里。 当然,有很多地方我也不懂代码的含义,这些地方我会表明,然后先略过去。

    启动 main函数在src/core/nginx.c文件中。 我们首先看一下nginx启动的部分,启动部分有很多函数,我们逐个的分析一下每个函数的作用。

    这个函数是设置debug相关功能的,在linux环境下,只是一个空的宏定义,可以略过。 这部分代码是在src/os/unix/ngx_errno.c文件中的,主要用于错误信息相关的输出。 这个文件包含了两个函数ngx_strerror_init和ngx_strerror,我们先看一下ngx_strerror_init函数,顾名思义,这是一个初始化函数。 代码

    ngx_int_t 2ngx_strerror_init(void) 3{ 4 char *msg; 5 u_char *p; 6 size_t len; 7 ngx_err_t err; 8 // int i 是测试代码 9 int i ;1011 /*12 * ngx_strerror() is not ready to work at this stage, therefore,13 * malloc() is used and possible errors are logged using strerror().14 */1516 len = NGX_SYS_NERR * sizeof(ngx_str_t);1718 ngx_sys_errlist = malloc(len);19 if (ngx_sys_errlist == NULL) {20 goto failed;21 }2223 for (err = 0; err < NGX_SYS_NERR; err++) {24 msg = strerror(err);25 len = ngx_strlen(msg);2627 p = malloc(len);28 if (p == NULL) {29 goto failed;30 }3132 ngx_memcpy(p, msg, len);33 ngx_sys_errlist[err].len = len;34 ngx_sys_errlist[err].data = p;35 }36// 下面的for循环是我们添加的测试代码 37 for(i = 0; i < NGX_SYS_NERR; i++){38 printf("errno is %d, msg is %s\n", i, ngx_sys_errlist[i].data);39 }4041 return NGX

    这里面用到了一个变量NGX_SYS_NERR,这是一个宏定义,是在auto/unix脚本中设置的,如下:

    ngx_feature="sys_nerr" 2ngx_feature_name="NGX_SYS_NERR" 3ngx_feature_run=value 4ngx_feature_incs='#include <errno.h> 5 #include <stdio.h>' 6ngx_feature_path= 7ngx_feature_libs= 8ngx_feature_test='printf("%d", sys_nerr);' 9. auto/feature

    这段脚本通过获取sys_nerr参数的值,然后赋值给NGX_SYS_NERR,这个参数表示的是当前操作系统提供的最大的错误码数值。

    我们在ngx_strerror_init中添加了一段测试代码,编译之后,启动nginx可以看到ngx_sys_errlist数组元素的值。

    1errno is 0, msg is Success 2errno is 1, msg is Operation not permitted 3errno is 2, msg is No such file or directory 4errno is 3, msg is No such process 5errno is 4, msg is Interrupted system call 6errno is 5, msg is Input/output error 7errno is 6, msg is No such device or address 8errno is 7, msg is Argument list too long 9errno is 8, msg is Exec format error 10errno is 9, msg is Bad file descriptor 11errno is 10, msg is No child processes 12errno is 11, msg is Resource temporarily unavailable 13errno is 12, msg is Cannot allocate memory 14errno is 13, msg is Permission denied 15errno is 14, msg is Bad address 16errno is 15, msg is Block device required 17errno is 16, msg is Device or resource busy 18errno is 17, msg is File exists 19errno is 18, msg is Invalid cross-device link 20errno is 19, msg is No such device 21errno is 20, msg is Not a directory 22errno is 21, msg is Is a directory 23errno is 22, msg is Invalid argument 24errno is 23, msg is Too

    这个函数是获取上面的ngx_sys_errlist数组的内容,函数非常简单

    1u_char * 2ngx_strerror(ngx_err_t err, u_char *errstr, size_t size) 3{ 4 ngx_str_t *msg; 5 6 msg = ((ngx_uint_t) err < NGX_SYS_NERR) ? &ngx_sys_errlist[err]: 7 &ngx_unknown_error; 8 size = ngx_min(size, msg->len); 910 return ngx_cpymem(errstr, msg->data, size);11}

    三个参数的含义如下: err : 错误的数值no errstr : 保存错误信息的字符串指针 size : 保存错

    总结:简单的分析一下启动过程中的错误信息的处理方法!

    文章原文: www.113p.cn(113资讯网)

    113资讯网 段师傅 本人性格开朗、稳重、有活力,待人热情、真诚,工作认真负责,积极主动,能吃苦耐劳,用于承受压力,勇于创新,有很强的组织能力和团队协作精神,具有较强的适应能力,纪律性强,工作积极配合,意志坚强,具有较强的无私奉献精神。
    Processed: 0.010, SQL: 9