当前位置: 首页 > news >正文

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 指向的内存中

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

 

http://www.lryc.cn/news/533644.html

相关文章:

  • 第26场蓝桥入门赛
  • 【CAPL实战】实现弹窗提示及操作
  • 基于ESP32的远程开关灯控制(ESP32+舵机+Android+物联网云平台)
  • 协议-ACLLite-ffmpeg
  • ARM嵌入式学习--第十四天(SPI)
  • DeepSeek-V2 论文解读:混合专家架构的新突破
  • 5分钟了解回归测试
  • 路由器如何进行数据包转发?
  • 【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 常见组件(一)
  • iOS 自动翻滚广告条(榜单条)实现方案
  • TensorFlow深度学习实战(7)——分类任务详解
  • 动态规划问题——青蛙跳台阶案例分析
  • element-ui使用el-table,保留字段前的空白
  • kamailio中路由模块汇总
  • 如何使用 DeepSeek 搭建本地知识库
  • 网络HTTP详细讲解
  • 《Origin画百图》之边际分布曲线图
  • 【Milvus】向量数据库pymilvus使用教程
  • React 生命周期函数详解
  • 第 26 场 蓝桥入门赛
  • 组合(力扣77)
  • 网络工程师 (22)网络协议
  • Linux之文件IO前世今生
  • 如何在Windows中配置MySQL?
  • Kafka 入门与实战
  • 数学知识学习1
  • 【AI日记】25.02.08
  • Lecture8 | LPV VXGI SSAO SSDO
  • Java中实现定时锁屏的功能(可以指定时间执行)
  • Java集合List详解(带脑图)