strerror是获取错误码对应的错误字符串的工具,nginx为了提高效率,把错误码和对应的描述保存在了静态的表里面,使用的时候,只需用到访问数据下标,就能快速读取到错误码信息。
nginx系统初始化之后,第一件事就是初始化strerror。首先初始化了一个static的指针指向了一块大小为NGX_SYS_NERR*seizeof(ngx_str_t)的内存。
typedef struct {
size_t len;
u_char *data;
} ngx_str_t;
ngx_str_t这个结构,是由长度和指向该长度的数据的指针组成的。
for (err = 0; err < NGX_SYS_NERR; err++) {
msg = strerror(err);
len = ngx_strlen(msg);
p = malloc(len);
if (p == NULL) {
goto failed;
}
ngx_memcpy(p, msg, len);
ngx_sys_errlist[err].len = len;
ngx_sys_errlist[err].data = p;
}
然后遍历strerror的值,并把该error的值和对应的字符串信息保存进ngx_sys_errlist.
使用的时候,根据读取信息的只在数据里面查找到对应的字符串指针。
ps:看了几篇ngint的相关blog之类,都说nginx尽量减少使用内存copy,从这里也能看出来一斑。
初始化一次,然后尽量引用这个初始化的信息。