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

news2025/2/22 7:20:37

ngx_os_specific_init

声明在 src/os/unix/ngx_os.h

ngx_int_t ngx_os_specific_init(ngx_log_t *log);

定义在 src\os\unix\ngx_linux_init.c

ngx_int_t
ngx_os_specific_init(ngx_log_t *log)
{
    struct utsname  u;

    if (uname(&u) == -1) {
        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "uname() failed");
        return NGX_ERROR;
    }

    (void) ngx_cpystrn(ngx_linux_kern_ostype, (u_char *) u.sysname,
                       sizeof(ngx_linux_kern_ostype));

    (void) ngx_cpystrn(ngx_linux_kern_osrelease, (u_char *) u.release,
                       sizeof(ngx_linux_kern_osrelease));

    ngx_os_io = ngx_linux_io;

    return NGX_OK;
}

通过调用系统调用 uname 获取操作系统的类型和版本信息,并将其存储到全局变量中,同时设置与操作系统相关的 I/O 方法 

主要逻辑 
开始
│
├─→ 调用uname(&u)
│   │
│   ├─失败→ 记录ALERT日志 → 返回NGX_ERROR
│   │
│   └─成功→ 复制sysname到ngx_linux_kern_ostype
│         │
│         → 复制release到ngx_linux_kern_osrelease
│         │
│         → 设置ngx_os_io = ngx_linux_io
│         │
│         → 返回NGX_OK
│
结束

 详解
调用 uname 获取系统信息
struct utsname u;
if (uname(&u) == -1) {
    ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "uname() failed");
    return NGX_ERROR;
}
  • uname 系统调用 uname 是一个 POSIX 标准的系统调用,用于获取当前操作系统的基本信息(如系统名称、内核版本等)。它将结果填充到 struct utsname 结构体中。
  • 错误处理 :如果 uname 调用失败(返回值为 -1),会记录错误日志并返回 NGX_ERROR,表示初始化失败。

 


uname

在 C 语言中,uname 函数用于获取当前操作系统的相关信息。它是 POSIX 标准的一部分,定义在 <sys/utsname.h> 头文件中。通过调用 uname 函数,可以获取系统名称、节点名称(主机名)、操作系统版本、机器硬件架构等信息。

函数原型

#include <sys/utsname.h>

int uname(struct utsname *buf);

参数说明

  • buf 是一个指向 struct utsname 的指针,函数会将系统信息填充到这个结构体中。

返回值

  • 成功时返回 0
  • 失败时返回 -1,并设置 errno 来指示错误原因。

struct utsname 定义如下:

struct utsname {
    char sysname[];  // 操作系统名称(例如 "Linux")
    char nodename[]; // 节点名称(通常是主机名)
    char release[];  // 操作系统发行版本
    char version[];  // 操作系统版本信息
    char machine[];  // 硬件架构(例如 "x86_64")
};

每个字段是一个字符数组,存储了对应的信息

复制系统类型和版本信息

(void) ngx_cpystrn(ngx_linux_kern_ostype, (u_char *) u.sysname,
                   sizeof(ngx_linux_kern_ostype));
(void) ngx_cpystrn(ngx_linux_kern_osrelease, (u_char *) u.release,
                   sizeof(ngx_linux_kern_osrelease));

 

  • u.sysnameu.release
    • u.sysname:表示操作系统的名称(如 "Linux")。
    • u.release:表示内核的版本号(如 "5.4.0-42-generic")。
  • 全局变量
    • ngx_linux_kern_ostype:存储操作系统名称。
    • ngx_linux_kern_osrelease:存储内核版本号。

设置操作系统相关的 I/O 方法

ngx_os_io = ngx_linux_io;

 

  • ngx_os_io :是一个全局变量,指向与操作系统相关的 I/O 方法集合(如文件读写、网络通信等)。
  • ngx_linux_io :是针对 Linux 系统实现的一组 I/O 方法。

 ngx_os_io  

定义在 src\os\unix\ngx_posix_init.c

ngx_os_io_t ngx_os_io = {
    ngx_unix_recv,
    ngx_readv_chain,
    ngx_udp_unix_recv,
    ngx_unix_send,
    ngx_udp_unix_send,
    ngx_udp_unix_sendmsg_chain,
    ngx_writev_chain,
    0
};

 ngx_linux_io

定义在 src\os\unix\ngx_linux_init.c

static ngx_os_io_t ngx_linux_io = {
    ngx_unix_recv,
    ngx_readv_chain,
    ngx_udp_unix_recv,
    ngx_unix_send,
    ngx_udp_unix_send,
    ngx_udp_unix_sendmsg_chain,
#if (NGX_HAVE_SENDFILE)
    ngx_linux_sendfile_chain,
    NGX_IO_SENDFILE
#else
    ngx_writev_chain,
    0
#endif
};

 


ngx_os_io_t

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_os_io_t 类型-CSDN博客

返回成功状态

return NGX_OK;

 

  • 如果所有步骤都成功执行,则返回 NGX_OK,表示初始化完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2301745.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux中的Ctrl+C与Ctrl+Z

CtrlC与CtrlZ的区别 在Linux中&#xff0c;当我们在执行一个命令运行代码时&#xff0c;由于运行时间过长或中途出现报错&#xff0c;此时&#xff0c;我们可能需要终止该操作&#xff0c;这时候&#xff0c;该使用CtrlC还是CtrlZ呢&#xff1f; 1、CtrlC CtrlC&#xff1a;终…

【深度学习】手写数字识别任务

数字识别是计算机从纸质文档、照片或其他来源接收、理解并识别可读的数字的能力&#xff0c;目前比较受关注的是手写数字识别。手写数字识别是一个典型的图像分类问题&#xff0c;已经被广泛应用于汇款单号识别、手写邮政编码识别等领域&#xff0c;大大缩短了业务处理时间&…

Linux-GlusterFS操作子卷

文章目录 分布式卷添加卷分布式卷删除子卷删除总卷 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Linux专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2025年02月20日19点30分 分布式卷添加卷 Node1上进行操作 扩容 #服务器端 gluster volu…

修改阿里云服务器内网ip

运维同事问能不能改我自己的服务内网ip&#xff0c; 买了一台服99元服务器&#xff0c;以为不能结果&#xff0c;结果还真改成功了&#xff0c; 分享一下经验。 首先最后关闭服务器-关机&#xff0c;必须要关闭服务 访问vpc控制台&#xff0c;就是要新建立一个网络 https://…

用DeepSeek零基础预测《哪吒之魔童闹海》票房——从数据爬取到模型实战

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 **一、为什么要预测票房&#xff1f;****二、准备工作****三、实战步骤详解****Step 1&#xff1a;数据爬取与清洗&am…

医院管理系统方案-基于蓝牙室内定位技术的院内智能导航系统:技术详解、功能设计及核心优势

文面向IT技术员、医院信息化负责人及物联网应用开发者&#xff0c;本文介绍了一款基于蓝牙室内定位技术的智能导航系统。该系统通过高精度定位与智能路径规划&#xff0c;极大提升了患者就医体验与医院运营效率。 如需获取院内智能导航系统技术文档可前往文章最下方获取&#x…

聊一聊vue如何实现角色权限的控制的

大家好&#xff0c;我是G探险者。 关于角色与权限控制&#xff0c;通常是分为两大类&#xff1a;一种是菜单权限&#xff1b;一种是操作权限。 菜单权限是指&#xff0c;每个角色对应着可以看到哪些菜单&#xff0c;至于每个菜单里面的每个按钮&#xff0c;比如增删改查等等这类…

TensorFlow深度学习实战——构建卷积神经网络实现CIFAR-10图像分类

TensorFlow深度学习实战——构建卷积神经网络实现CIFAR-10图像分类 0. 前言1. CIFAR-10 数据集介绍2. CIFAR-10 图像分类3. 提升模型性能3.1 增加网络深度3.2 数据增强 4. 模型测试相关链接 0. 前言 我们已经学习了卷积神经网络 (Convolutional Neural Network, CNN) 的基本概…

服务器创建conda环境并安装使用jupyter

1.创建conda环境 conda create --name myenv python3.8 conda activate myenv其中 myenv 是您想要创建的环境名称&#xff0c;可以根据需要替换为其他名称。2.安装juypter conda install jupyter3.启动juypter jupyter notebook复制链接到浏览器打开 4.设置jupyter使用的 …

【HarmonyOS Next】鸿蒙监听手机按键

【HarmonyOS Next】鸿蒙监听手机按键 一、前言 应用开发中我们会遇到监听用户实体按键&#xff0c;或者扩展按键的需求。亦或者是在某些场景下&#xff0c;禁止用户按下某些按键的业务需求。 这两种需求&#xff0c;鸿蒙都提供了对应的监听事件进行处理。 onKeyEvent 默认的…

【Spring详解五】bean的加载

五、bean的加载 当我们显示或者隐式地调用 getBean() 时&#xff0c;则会触发加载 bean 阶段。示例代码如下&#xff1a; public class AppTest {Testpublic void MyTestBeanTest() {BeanFactory bf new XmlBeanFactory( new ClassPathResource("spring-config.xml"…

ThinkPHP(TP)如何做安全加固,防webshell、防篡改、防劫持、TP漏洞防护

ThinkPHP是一款非常知名的PHP框架&#xff0c;很多知名CMS系统都是采用TP框架进行二次开发而来&#xff0c;当然ThinkPHP本身也可以直接建站&#xff0c;开源免费、功能强大&#xff0c;深受广大用户喜欢。 虽然ThinkPHP非常优秀&#xff0c;但是为了保障网站安全&#xff0c;我…

MySQL(1)基础篇

执行一条 select 语句&#xff0c;期间发生了什么&#xff1f; | 小林coding 目录 1、连接MySQL服务器 2、查询缓存 3、解析SQL语句 4、执行SQL语句 5、MySQL一行记录的存储结构 Server 层负责建立连接、分析和执行 SQL存储引擎层负责数据的存储和提取。支持InnoDB、MyIS…

分裂栅结构对碳化硅MOSFET重复雪崩应力诱导退化的抑制作用

标题 Suppression Effect of Split-Gate Structure on Repetitive Avalanche Stress Induced Degradation for SiC MOSFETs&#xff08;TED 24年&#xff09; 文章的研究内容 这篇文章的研究探讨了重复雪崩应力对碳化硅&#xff08;SiC&#xff09;MOSFET器件退化的影响&am…

JavaEE基础之- xml

目录 一、xml概述 1.什么是xml 2.W3C组织 3.XML的作用 4.XML与HTML比较 5.XML和properties&#xff08;属性文件&#xff09;比较 二、XML语法概述 1.文档展示 2.XML文档的组成部分 3.xml文档声明 3.1 什么是xml文档声明 3.2 xml文档声明结构 4.xml元素 4.1 xml元素的格…

网络运维学习笔记 012网工初级(HCIA-Datacom与CCNA-EI)某机构新增:GRE隧道与EBGP实施

文章目录 GRE隧道&#xff08;通用路由封装&#xff0c;Generic Routing Encapsulation&#xff09;协议号47实验&#xff1a;思科&#xff1a;开始实施&#xff1a; 华为&#xff1a;开始实施&#xff1a; eBGP实施思科&#xff1a;华为&#xff1a; GRE隧道&#xff08;通用路…

RK3568开发板/电脑/ubuntu处于同一网段互通

1.查看无线局域网适配器WLAN winR输入cmd打开电脑终端输入ipconfig或arp -a查看无线局域网IP地址&#xff0c;这就是WIFI. 这里的IPv4是192.168.0.147&#xff0c;默认网关是192.168.0.1&#xff0c;根据网关地址配以太网IP, ubuntu的IP,和rk3568的IP。 且IP范围为192.168.…

如何调用 DeepSeek API:详细教程与示例

目录 一、准备工作 二、DeepSeek API 调用步骤 1. 选择 API 端点 2. 构建 API 请求 3. 发送请求并处理响应 三、Python 示例&#xff1a;调用 DeepSeek API 1. 安装依赖 2. 编写代码 3. 运行代码 四、常见问题及解决方法 1. API 调用返回 401 错误 2. API 调用返回…

如何在Jenkins上查看Junit报告

在 Jenkins 上查看 JUnit 报告通常有以下几个步骤&#xff1a; 构建结果页面: 首先&#xff0c;确保你的 Jenkins 构建已经执行完毕&#xff0c;并且成功生成了 JUnit 报告。前往 Jenkins 主页面&#xff0c;点击进入相应的项目或流水线。 构建记录: 选择你想查看的特定构建记…

【深度学习】计算机视觉(CV)-图像生成-风格迁移(Style Transfer)

风格迁移&#xff08;Style Transfer&#xff09; 风格迁移是一种计算机视觉技术&#xff0c;可以将一张图像的内容和另一张图像的风格融合在一起&#xff0c;生成一张既保留原始内容&#xff0c;又带有目标风格的全新图像&#xff01;这种方法常用于艺术创作、图像增强、甚至…