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

ngx_init_signals

1 定义

ngx_init_signals 函数 定义在 ./nginx-1.24.0/src/os/unix/ngx_process.c
ngx_int_tngx_init_signals(ngx_log_t*log){ngx_signal_t*sig;structsigactionsa;for(sig=signals;sig->signo!=0;sig++){ngx_memzero(&sa,sizeof(structsigaction));if(sig->handler){sa.sa_sigaction=sig->handler;sa.sa_flags=SA_SIGINFO;}else{sa.sa_handler=SIG_IGN;}sigemptyset(&sa.sa_mask);if(sigaction(sig->signo,&sa,NULL)==-1){#if(NGX_VALGRIND)ngx_log_error(NGX_LOG_ALERT,log,ngx_errno,"sigaction(%s) failed, ignored",sig->signame);#elsengx_log_error(NGX_LOG_EMERG,log,ngx_errno,"sigaction(%s) failed",sig->signame);returnNGX_ERROR;#endif}}returnNGX_OK;}
ngx_init_signals 函数的作用是 初始化 Nginx 进程的信号处理机制。 它遍历预定义的信号列表,通过 sigaction 系统调用为每个信号注册自定义处理函数 确保进程能够响应如优雅退出、配置重载等控制指令。 若注册失败,在生产环境下会直接导致启动终止。

2 详解

1 函数签名

ngx_int_tngx_init_signals(ngx_log_t*log)
返回值 NGX_OK(0):表示信号初始化成功。 NGX_ERROR( -1):表示初始化过程中出现严重错误,导致 Nginx 无法继续启动。
参数 Nginx 自定义的日志对象结构体 在 sigaction 调用失败时,需要向错误日志写入记录

2 逻辑流程

1 局部变量 2 遍历 注册信号处理函数 3 返回成功

1 局部变量
{ngx_signal_t*sig;structsigactionsa;

2 遍历 注册信号处理函数
for(sig=signals;sig->signo!=0;sig++){ngx_memzero(&sa,sizeof(structsigaction));if(sig->handler){sa.sa_sigaction=sig->handler;sa.sa_flags=SA_SIGINFO;}else{sa.sa_handler=SIG_IGN;}sigemptyset(&sa.sa_mask);if(sigaction(sig->signo,&sa,NULL)==-1){#if(NGX_VALGRIND)ngx_log_error(NGX_LOG_ALERT,log,ngx_errno,"sigaction(%s) failed, ignored",sig->signame);#elsengx_log_error(NGX_LOG_EMERG,log,ngx_errno,"sigaction(%s) failed",sig->signame);returnNGX_ERROR;#endif}}
#1 sig = signals signals 是 Nginx 定义的全局静态数组,类型为 ngx_signal_t。 该结构体包含三个成员:信号编号 signo、信号名字符串 signame 和信号处理函数指针 handler。 初始化指针指向数组首元素。 sig->signo != 0 循环继续条件。 数组最后一个元素的 signo 成员被刻意设置为 0 这是一个常见的哨兵值技巧 sig++ 指针向后移动一个 ngx_signal_t 结构体的大小,指向下一个待处理的信号。
#2 清空结构体内存 struct sigaction sa 是在循环外部栈上分配的局部变量。 每次迭代开始必须将其内容归零。 避免残留的垃圾信息影响后续操作
#3 根据配置选择信号处理行为
#3-1 if (sig->handler) 分支(自定义处理): sa.sa_sigaction = sig->handler; sigaction 结构体内含一个共用体。 当标志位包含 SA_SIGINFO 时, 内核调用的是 sa_sigaction 指向的函数(三参数形式),而不是 sa_handler。 这里填入的是 Nginx 内部的信号处理函数(如 ngx_signal_handler)。 sa.sa_flags = SA_SIGINFO; 告诉内核使用扩展信号处理器。 这使得 Nginx 能够接收到发送者 PID、错误地址等额外上下文信息(siginfo_t),
#3-2 else 分支(显式忽略): sa.sa_handler = SIG_IGN; 如果 sig->handler 为 NULL, Nginx 不希望接收该信号。此时直接使用标准库定义的忽略宏 SIG_IGN。 此处未设置 SA_SIGINFO 标志,因此内核只会调用传统的单参数函数(或执行忽略动作)。
#4 初始化信号掩码 将信号集初始化为空集 这意味着在运行此信号的处理函数期间,不自动阻塞任何其他信号 Nginx 之所以这样做,是因为其信号处理函数设计得极短且可重入
#5 执行系统调用注册信号 sigaction:POSIX 标准的系统调用,用于改变进程对特定信号的处理行为 参数 1:sig->signo —— 要操作的信号编号(如 SIGTERM 对应的 15)。 参数 2:&sa —— 指向新动作结构体的指针。 参数 3:NULL —— 不保存旧的处理动作。 返回值检查: 返回 -1 表示失败(如信号编号无效、内核资源不足)。 若成功,该信号的新处理方式已在内核进程描述符中生效。
#6 错误处理 记录日志 返回错误状态码

3 返回成功
returnNGX_OK;}
http://www.jsqmd.com/news/650641/

相关文章:

  • OpenProject:企业级开源项目管理解决方案,提升团队协作效率47%
  • Unity微信小游戏接入游戏圈新接口实战指南
  • 2026 年微软邮件投递遇阻:排查原因、实现限流,72 小时解决问题
  • 【独家首发】全球首份生成式AI混沌成熟度评估模型(CMM-AI v1.0):5级能力图谱+17项量化指标
  • 2026年数据资产管理平台,知名厂商与实力公司全面推荐合集 - 品牌2026
  • 国民技术 N32G455CEQ7 LQFP-48 单片机
  • 从Turbo C到VSCode:手把手教你修复一个90年代的哈夫曼编码C程序(含conio.h替换方案)
  • foobar2000歌词插件foo_openlyrics:打造专业音乐播放体验的终极解决方案
  • [特殊字符]Docker实战手册:从零构建、镜像优化到生产部署[特殊字符]
  • Simulink信号与参数工程化配置:从模型到代码的接口设计
  • 微电网核心技术解析:从电力电子控制到多源协同优化
  • 蓝牙频段解析:从基础信道到抗干扰优化
  • 无刷电机控制避坑指南:Simulink六步逆变器建模的5个易错点
  • 山峰与山谷(bfs)
  • 驱动人生离线版使用教程:免联网驱动安装与硬件检测
  • 精选 2026 年大厂高频 Java 面试真题集锦(含答案整理)
  • 如何在Windows上快速搭建虚拟游戏手柄系统:vJoy完整配置教程
  • ComfyUI超分辨率终极指南:从基础放大到AI驱动的4K/8K图像生成
  • 生成式AI运维自动化落地难?3个被90%团队忽略的LLM集成关键指标曝光
  • 2026年私有化部署资产管理系统哪家好?国资部署公司全解析 - 品牌2026
  • 【行业深度对谈】穿透“文凭焦虑”:翼程教育17年深耕湖南,合规办学助力三湘人才学历突围 - 商业科技观察
  • 生成式AI服务宕机后如何秒级恢复?揭秘头部企业正在用的4层容灾备份架构
  • Bright Data 亮数据产品使用场景更新
  • 零基础玩转GTE文本向量:中文命名实体识别与情感分析实战教程
  • 2026年3C消费电子五金解决方案厂家推荐top榜单,通讯设备五金解决方案/储能行业五金解决方案/工控行业精密五金方案 - 品牌策略师
  • 朱雀AI检测率多少算高?合格标准解读+降AI方案推荐 - 我要发一区
  • 回收天虹购物卡靠谱吗?常见问题与实用心得盘点 - 团团收购物卡回收
  • STC32G12K128 LCM模块库函数深度重构与I8080时序实战解析
  • 数字时代的存储救星:CompressO如何用开源技术解决视频存储危机
  • 用Python手把手实现RLS算法:从理论公式到代码实战(附完整源码)