声明
ngx_strerror 函数声明在 ngx_errno.h 中:
u_char *ngx_strerror(ngx_err_t err, u_char *errstr, size_t size);
实现
在 ngx_errno.c 中:
u_char * ngx_strerror(ngx_err_t err, u_char *errstr, size_t size) {size_t len;const char *msg;msg = strerrordesc_np(err);if (msg == NULL) {msg = (char *) ngx_unknown_error.data;len = ngx_unknown_error.len;} else {len = ngx_strlen(msg);}size = ngx_min(size, len);return ngx_cpymem(errstr, msg, size); }
参数分析
ngx_err_t err
系统错误码(Error Number)。通过该错误码查找对应的错误描述信息
u_char *errstr
存储转换后的错误描述字符串的目标缓冲区指针
size_t size
这是一个无符号整数,表示目标缓冲区
errstr
的最大可用空间长度(字节数)这个参数用来限制函数写入错误信息的长度,防止内存溢出
返回值
类型:
u_char*
含义:指向
errstr
缓冲区中复制完成后的下一位置的指针这个返回值可以用来链式调用或者检查函数是否成功执行
size_t len
:用来存储错误信息字符串的长度
const char *msg
:用来存储错误信息字符串的指针
msg = strerrordesc_np(err);
调用
strerrordesc_np
函数,将错误码err
转换为对应的错误信息字符串,并将结果存储到msg
中。
strerrordesc_np
是一个函数,它的作用是根据错误码返回对应的错误描述字符串,如果
err
是一个有效的错误码,strerrordesc_np
会返回一个指向错误描述字符串的指针
strerrordesc_np
strerrordesc_np
是 GNU C 库(glibc)中的一个扩展函数,用于获取与特定错误号对应的错误描述字符串。该函数接受一个整数错误号(如
errno
的值),直接返回对应的错误描述字符串(如 "No such file or directory")返回的字符串为只读,不可修改,避免了意外修改错误描述的风险
strerrordesc_np
是 glibc 提供的高效、线程安全的错误描述获取函数,适用于需要稳定输出错误信息的场景,尤其在多线程环境中使用
strerrordesc_np
函数需要#include <string.h>
另外在编译时加上 -D_GNU_SOURCE参数
例如:
gcc -D_GNU_SOURCE -o test test.c
定义
_GNU_SOURCE
宏后,编译器会启用GNU/Linux系统特有的扩展函数,这些函数在默认情况下可能无法使用
if (msg == NULL) {msg = (char *) ngx_unknown_error.data;len = ngx_unknown_error.len;} else {len = ngx_strlen(msg);}
如果
msg
是NULL
,说明strerrordesc_np
没有找到对应的错误描述,此时使用ngx_unknown_error
提供的默认未知错误信息。
ngx_unknown_error.data
是一个包含默认未知错误信息的字符串,ngx_unknown_error.len
是它的长度如果
msg
不是NULL
,说明找到了对应的错误描述,使用ngx_strlen
函数计算字符串的长度
ngx_unknown_error
ngx_errno.c 的开头
static ngx_str_t ngx_unknown_error = ngx_string("Unknown error");
ngx_string(str) 在 ngx_string.h 中
#define ngx_string(str) { sizeof(str) - 1, (u_char *) str }
ngx_str_t
声明在 ngx_string.h 中:
typedef struct {size_t len;u_char *data; } ngx_str_t;
第一个成员是 len,第二个成员是 *data
所以
sizeof(str) - 1 是第一个成员len,表示字符串长度
(u_char *) str 是第二个成员*data,指向字符串的指针
ngx_strlen
ngx_string.h 中:
#define ngx_strlen(s) strlen((const char *) s)
本质就是调用 strlen 函数,计算字符串的长度
size = ngx_min(size, len);
将
size
和len
中的较小值赋给size
,限制写入的长度
ngx_min
是一个函数,返回两个参数中的较小值这里的目的是防止写入的错误信息超出
errstr
指向的内存大小,避免内存溢出
return ngx_cpymem(errstr, msg, size);
将
msg
指向的错误信息字符串的前size
个字节复制到errstr
指向的内存中,并返回errstr
gx_cpymem
是一个函数,用来将内存从一个位置复制到另一个位置这里将错误信息字符串的前
size
个字节复制到errstr
指向的内存中返回的指针指向缓冲区最后一个字符的下一个字节,方便链式调用或者检查函数是否成功执行