欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 培训 > Ubuntu 下 nginx-1.24.0 源码分析 - ngx_strerror 函数

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_strerror 函数

2025/2/22 2:15:13 来源:https://blog.csdn.net/weixin_41812346/article/details/145480738  浏览:    关键词:Ubuntu 下 nginx-1.24.0 源码分析 - ngx_strerror 函数

声明

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);}

如果 msgNULL,说明 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);

sizelen 中的较小值赋给 size,限制写入的长度

 ngx_min 是一个函数,返回两个参数中的较小值

这里的目的是防止写入的错误信息超出 errstr 指向的内存大小,避免内存溢出

    return ngx_cpymem(errstr, msg, size);

 将 msg 指向的错误信息字符串的前 size 个字节复制到 errstr 指向的内存中,并返回 errstr

gx_cpymem 是一个函数,用来将内存从一个位置复制到另一个位置

这里将错误信息字符串的前 size 个字节复制到 errstr 指向的内存中

返回的指针指向缓冲区最后一个字符的下一个字节,方便链式调用或者检查函数是否成功执行

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词