nginx之main函数的解读(三)
2014-10-10 21:15
4647 查看
接下来,开始进行函数调用了
现在说下ngx_strerror_init函数,该函数定义在os文件夹下的unix下的ngx_error.c文件下面
现在我们说下ngx_log_stderr的函数:
这里面的内容有一个函数是ngx_log_errno,该函数记录了真正的错误信息
而ngx_strerror函数应该是
ngx_debug_init(); if (ngx_strerror_init() != NGX_OK) { return 1; }ngx_debug_init(),主要是在debug方面,然而,该函数现如今不进行任何操作,可以放过(笔者没有看出比较实质性的操作,大牛路过,可指出错误)
现在说下ngx_strerror_init函数,该函数定义在os文件夹下的unix下的ngx_error.c文件下面
ngx_int_t ngx_strerror_init(void) { char *msg; u_char *p; size_t len; ngx_err_t err; /* * ngx_strerror() is not ready to work at this stage, therefore, * malloc() is used and possible errors are logged using strerror(). */ <pre name="code" class="cpp"> //现在说下NGX_SYS_NERR,该NGX_SYS_NERR只有在安装了nginx之后产生在ngx_auto_config.h //#define NGX_SYS_NERR 132其含义就是,在linux系统中有132个错误代码,也就是说, //通过使用strerror获得系统中的错误信息,并且填充在ngx_sys_errlist数组中,如果需要使用不再向系统问询 //而ngx_sys_errlist是定义在ngx_error.c中的全局变量,只是static ngx_str_t *ngx_sys_errlist; len = NGX_SYS_NERR * sizeof(ngx_str_t); //使用malloc函数开辟了132个ngx_str_t,当然ngx_str_t内部的空间还没有开辟 ngx_sys_errlist = malloc(len); if (ngx_sys_errlist == NULL) { goto failed; } for (err = 0; err < NGX_SYS_NERR; err++) { //strerror这样我们就得到了错误编码的错误信息 msg = strerror(err); //len是系统错误信息的字符串长度 len = ngx_strlen(msg); //动态开辟空间,因为是动态的,所以不需要担心被释放 p = malloc(len); if (p == NULL) { //开辟失败,进行错误处理 goto failed; } //将错误信息放在我们当初开辟的空间当中 ngx_memcpy(p, msg, len); //将错误信息放在ngx_sys_errlist数组当中 ngx_sys_errlist[err].len = len; ngx_sys_errlist[err].data = p; } return NGX_OK;//原来还可以这么使用标签,在return 后面,学习了 failed: err = errno; //这样我们将该错误记录到错误日志当中 ngx_log_stderr(0, "malloc(%uz) failed (%d: %s)", len, err, strerror(err)); return NGX_ERROR; }
现在我们说下ngx_log_stderr的函数:
void ngx_cdecl ngx_log_stderr(ngx_err_t err, const char *fmt, ...) { u_char *p, *last; va_list args; u_char errstr[NGX_MAX_ERROR_STR];//这里面是错误信息的最大长度,该值是定义在core中的ngx_log.g当中其值是2048 last = errstr + NGX_MAX_ERROR_STR;//last是错误信息的结束位置 p = errstr + 7;//p呢,就是错误信息的真正开始 ngx_memcpy(errstr, "nginx: ", 7);// va_start(args, fmt); p = ngx_vslprintf(p, last, fmt, args);//p应该是在该信息的结束位置 va_end(args);//这部分呢,就是根据可变参数,将真正的信息放在内存当中p, if (err) { //如果错误代码不是0,则系统标准的错误信息放在了p当中,也就是说如果是0,那么就是系统自定义的错误信息,我们需要p中的信息 p = ngx_log_errno(p, last, err); } if (p > last - NGX_LINEFEED_SIZE) {//NGX_LINEFEED_SIZE放在了os/unix当中的ngx_files.h文件当中该值是1 //检测p中是否有内容 p = last - NGX_LINEFEED_SIZE;//如果p和last } // ngx_linefeed(p); //在p指向后面添加一个"\n"字符,换句话而言就是在nginx:后面加一个换行字符,之后才是真正的信息 <pre name="code" class="cpp"> //ngx_write_console的重定义,就是write(fd,buf,len);而<span class="reserved">#define</span> <a target=_blank class="fid" href="http://lxr.nginx.org/ident?_i=ngx_stderr">ngx_stderr</a> STDERR_FILENO,直接控制台输出(void) ngx_write_console(ngx_stderr, errstr, p - errstr); }
这里面的内容有一个函数是ngx_log_errno,该函数记录了真正的错误信息
u_char * ngx_log_errno(u_char *buf, u_char *last, ngx_err_t err) { if (buf > last - 50) { //如果错误信息不足50个字符,那么就重新设置50个字符 /* leave a space for an error code */ buf = last - 50; *buf++ = '.'; *buf++ = '.'; *buf++ = '.'; } #if (NGX_WIN32) buf = ngx_slprintf(buf, last, ((unsigned) err < 0x80000000) ? " (%d: " : " (%Xd: ", err);//这样,在win32系统下,转换成相应的错误代码,这也是一个可变参数转换成字符串 #else buf = ngx_slprintf(buf, last, " (%d: ", err);//同上 #endif buf = ngx_strerror(err, buf, last - buf); //这部分函数检错错误信息是否是已知的,从而将错误信息放在buf当中,不是,也放在了buf当中 if (buf < last) { *buf++ = ')'; } return buf; }
而ngx_strerror函数应该是
u_char * ngx_strerror(ngx_err_t err, u_char *errstr, size_t size) { ngx_str_t *msg; msg = ((ngx_uint_t) err < NGX_SYS_NERR) ? &ngx_sys_errlist[err]://这样,我们就可以知道,错误代码是否小于132,进而判断错误信息是否在ngx_sys_errlist中 &ngx_unknown_error; size = ngx_min(size, msg->len); return ngx_cpymem(errstr, msg->data, size);//最后将原来存储的错误信息放在errstr当中 }那么日志记录部分就结束了
相关文章推荐
- nginx之main函数的解读(五)
- nginx之main函数的解读(六)
- nginx之main函数的解读(八)
- nginx之main函数的解读(四)
- nginx之main函数的解读(一)
- nginx之main函数的解读(七)
- 解剖Nginx·模块开发篇(5)解读内置非默认模块 ngx_http_stub_status_module
- Nginx配置解读,虚拟主机,https配置,反向代理,https重定向
- nginx详细解读location rewrite和proxy_pass
- FastDFS的配置、部署与API使用解读(7)Nginx的FastDFS模块(转)
- FastDFS的配置、部署与API使用解读(7)Nginx的FastDFS模块
- 【Nginx源码解读】事件处理模块
- FastDFS的配置、部署与API使用解读(7)Nginx的FastDFS模块
- 菜鸟nginx源代码剖析 框架篇(一) 从main函数看nginx启动流程
- 菜鸟nginx源码剖析 框架篇(一) 从main函数看nginx启动流程
- 解读:nginx的一个神秘配置worker_cpu_affinity
- 文章2:nginx启动过程之main函数
- 基于 Nginx 的软件负载均衡实现解读
- 解读nginx中limit配置参数
- Nginx源码编译安装及配置文件解读