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

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_cycle 函数 - 详解(6)

详解(6)


初始化监听套接字数组(listening

    n = old_cycle->listening.nelts ? old_cycle->listening.nelts : 10;

    if (ngx_array_init(&cycle->listening, pool, n, sizeof(ngx_listening_t))
        != NGX_OK)
    {
        ngx_destroy_pool(pool);
        return NULL;
    }

    ngx_memzero(cycle->listening.elts, n * sizeof(ngx_listening_t));

1 确定监听数组初始容量

n = old_cycle->listening.nelts ? old_cycle->listening.nelts : 10;

根据旧周期(old_cycle)的监听套接字数量设置新周期的初始容量 n
若旧周期无监听套接字,则默认预分配 10 个元素。

  • old_cycle->listening.nelts 是旧周期监听数组的元素数量。
  • 若存在旧监听套接字,继承其数量;否则使用默认值 10。

监听数组(listening)存储 Nginx 监听的端口和套接字信息(如 listen 80;)。在平滑重启时需继承旧配置,避免重新绑定端口。


2 初始化监听数组

if (ngx_array_init(&cycle->listening, pool, n, sizeof(ngx_listening_t)) != NGX_OK)

初始化动态数组 cycle->listening,用于存储监听套接字信息。

  • pool:内存池,用于管理数组内存。
  • n:初始容量(继承旧值或默认 10)。
  • sizeof(ngx_listening_t):每个元素的大小(监听套接字结构体)。

3 错误处理

{
    ngx_destroy_pool(pool);
    return NULL;
}

若数组初始化失败,销毁内存池并终止函数。


4 初始化内存

ngx_memzero(cycle->listening.elts, n * sizeof(ngx_listening_t));

将监听数组的前 n 个元素清零。

ngx_memzeromemset 的封装,确保内存初始化为 0。

动态数组分配的内存可能包含脏数据,直接使用可能导致未定义行为(如误判套接字状态)。



http://www.kler.cn/a/568166.html

相关文章:

  • 51单片机制作彩屏触摸小电子琴STC32G12K128+RA6809+彩屏1024x600
  • 【云原生之kubernetes实战】在k8s环境下部署Vikunja任务管理工具
  • openlayers结合turf geojson面获取面积和中心点
  • 详细对比所有开源许可及其不同版本
  • c++ std::array使用笔记
  • 「Selenium+Python自动化从0到1①|2025最新环境搭建+浏览器驱动避坑指南(附验证代码)」
  • JSON(JavaScript Object Notation)
  • 【Java 基础(人话版)】Java SE vs Java EE
  • 第十五站:循环神经网络(RNN)与长短期记忆网络(LSTM)
  • redis的启动方式
  • Linux——计算机网络
  • 【SDR课堂第12讲】AD9361毛刺问题总结
  • 手写RPC框架-V1版本
  • 一周学会Flask3 Python Web开发-Jinja2模版中加载静态文件
  • 2.9作业
  • 大模型最新面试题系列:训练篇之数据处理与增强
  • Python可视化大框架的研究与应用
  • 聊聊大数据测试开展方向有哪些?
  • Protobuf原理与序列化
  • Android中的四大组件及其生命周期