//ngx_err_t 代表错误的个数 const char * fmt格式字符串,有着格式信息
//typedef int ngx_err_t;//代表错误的个数
//... 代表可变参数
void ngx_log_stderr(ngx_err_t err, const char *fmt, ...)
{
//其实代表字符时 char 和 uchar 没有区别,*p 代表写入头指针
u_char *p, *last;
va_list args;//即 ...
u_char errstr[NGX_MAX_ERROR_STR];//结果 #define NGX_MAX_ERROR_STR 2048 2048Bytes
last = errstr + NGX_MAX_ERROR_STR;//尾边界 不包含
//内存操作宏定义
// #define ngx_cpymem(dst, src, n) (((u_char *) memcpy(dst, src, n)) + (n))
// #define ngx_memzero(buf, n) (void) memset(buf, 0, n)
// #define ngx_memset(buf, c, n) (void) memset(buf, c, n)
p = ngx_cpymem(errstr, "nginx: ", 7);
//此时p指向可以写入的头部
va_start(args, fmt);//内存分配即把fmt中的参数分配到args中
p = ngx_vslprintf(p, last, fmt, args);
va_end(args);//释放内存
if (err) {//定义了错误信息
p = ngx_log_errno(p, last, err);
}
// #define NGX_LINEFEED_SIZE 1 last-NGX_LINEFEED_SIZE即最后一个可以使用的位置
if (p > last - NGX_LINEFEED_SIZE) {
p = last - NGX_LINEFEED_SIZE;//超过了使用空间,调整
}
//#define ngx_linefeed(p) *p++ = LF;
ngx_linefeed(p);
// #define LF (u_char) '\n'//unix/linux下
// #define CR (u_char) '\r'//mac下
// #define CRLF "\r\n" //windows下
//都代表换行 此处代表linux下的回车符
(void) ngx_write_console(ngx_stderr, errstr, p - errstr);
//#define ngx_write_console ngx_write_fd
//static ngx_inline ssize_t
// ngx_write_fd(ngx_fd_t fd, void *buf, size_t n)
// {
// return write(fd, buf, n);
// }
//#define ngx_stderr STDERR_FILENO
//#define ngx_inline inline
//ngx_inline代表inile是一个宏
}
Nginx ngx_log_stderr源码分析(上)
最新推荐文章于 2024-07-25 22:32:15 发布