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

ngx_signal_process

1 定义

ngx_signal_process 函数 定义在 ./nginx-1.24.0/src/core/ngx_cycle.c
ngx_int_tngx_signal_process(ngx_cycle_t*cycle,char*sig){ssize_tn;ngx_pid_tpid;ngx_file_tfile;ngx_core_conf_t*ccf;u_char buf[NGX_INT64_LEN+2];ngx_log_error(NGX_LOG_NOTICE,cycle->log,0,"signal process started");ccf=(ngx_core_conf_t*)ngx_get_conf(cycle->conf_ctx,ngx_core_module);ngx_memzero(&file,sizeof(ngx_file_t));file.name=ccf->pid;file.log=cycle->log;file.fd=ngx_open_file(file.name.data,NGX_FILE_RDONLY,NGX_FILE_OPEN,NGX_FILE_DEFAULT_ACCESS);if(file.fd==NGX_INVALID_FILE){ngx_log_error(NGX_LOG_ERR,cycle->log,ngx_errno,ngx_open_file_n" \"%s\" failed",file.name.data);return1;}n=ngx_read_file(&file,buf,NGX_INT64_LEN+2,0);if(ngx_close_file(file.fd)==NGX_FILE_ERROR){ngx_log_error(NGX_LOG_ALERT,cycle->log,ngx_errno,ngx_close_file_n" \"%s\" failed",file.name.data);}if(n==NGX_ERROR){return1;}while(n--&&(buf[n]==CR||buf[n]==LF)){/* void */}pid=ngx_atoi(buf,++n);if(pid==(ngx_pid_t)NGX_ERROR){ngx_log_error(NGX_LOG_ERR,cycle->log,0,"invalid PID number \"%*s\" in \"%s\"",n,buf,file.name.data);return1;}returnngx_os_signal_process(cycle,sig,pid);}
ngx_signal_process 函数的作用是: 从 Nginx 配置指定的 PID 文件中读取主进程号, 并向该进程发送指定的信号(如 `reload`、`stop`、`quit` 等), 从而实现 Nginx 的优雅重启、停止、日志重开等运行中管理操作。

2 详解

1 函数签名

ngx_int_tngx_signal_process(ngx_cycle_t*cycle,char*sig)
返回值 成功:返回 NGX_OK(定义为 0)。 失败:返回 NGX_ERROR(定义为 -1)
参数 ngx_cycle_t *cycle 指向当前运行周期环境 参数 char *sig C 风格字符串指针,指向以 \0 结尾的字符数组 实际传入内容: Nginx 定义的信号名称字符串,例如: "stop" —— 对应快速关闭(SIGTERM)。 "quit" —— 对应优雅关闭(SIGQUIT)。 "reload" —— 对应重新加载配置文件(SIGHUP)。 "reopen" —— 对应重新打开日志文件(SIGUSR1)。

2 逻辑流程

1 局部变量 2 记录日志 3 读取 PID 文件内容 4 解析读取内容 5 发送信号

1 局部变量
{ssize_tn;ngx_pid_tpid;ngx_file_tfile;ngx_core_conf_t*ccf;u_char buf[NGX_INT64_LEN+2];
2 记录日志
ngx_log_error(NGX_LOG_NOTICE,cycle->log,0,"signal process started");

3 读取 PID 文件内容
ccf=(ngx_core_conf_t*)ngx_get_conf(cycle->conf_ctx,ngx_core_module);
获取核心模块配置

ngx_memzero(&file,sizeof(ngx_file_t));
初始化文件结构体 将栈上的 ngx_file_t 结构体变量 file 的所有字节清零。
file.name=ccf->pid;file.log=cycle->log;
将核心配置中的 PID 文件路径赋值给 file.name 将全局日志对象 cycle->log 赋给 file.log

file.fd=ngx_open_file(file.name.data,NGX_FILE_RDONLY,NGX_FILE_OPEN,NGX_FILE_DEFAULT_ACCESS);if(file.fd==NGX_INVALID_FILE){ngx_log_error(NGX_LOG_ERR,cycle->log,ngx_errno,ngx_open_file_n" \"%s\" failed",file.name.data);return1;}
#1 尝试以只读模式打开 PID 文件,并返回文件描述符 参数 1 file.name.data:文件路径字符串。 参数 2 NGX_FILE_RDONLY:只读模式(通常是 O_RDONLY)。 参数 3 NGX_FILE_OPEN:表示只打开已存在的文件,不创建 参数 4 NGX_FILE_DEFAULT_ACCESS: 默认权限模式(创建文件时用,但此处未创建,所以实际上被忽略或为 0)。 返回值是文件描述符, 如果失败则返回 NGX_INVALID_FILE(通常是 -1)。 意义: PID 文件必须已经存在(由正在运行的 Nginx 主进程创建), 这里使用只读且不创建的模式打开,如果文件不存在,直接失败,符合预期。 #2 如果打开文件失败,记录错误日志并返回错误码 1

n=ngx_read_file(&file,buf,NGX_INT64_LEN+2,0);
读取 PID 文件内容到缓冲区 从已打开的文件中读取数据到 buf,并返回实际读取的字节数。 参数 1 &file:包含文件描述符和日志对象的文件结构。 参数 2 buf:目标缓冲区,大小为 NGX_INT64_LEN + 2 字节。 参数 3 NGX_INT64_LEN + 2:读取的最大字节数。+2 是为了可能的回车换行符 \r\n。 参数 4 0:偏移量,表示从文件当前位置(文件开头)开始读取。 返回值 n:成功读取的字节数;若出错则返回 NGX_ERROR。 意义: 只读取有限字节,因为 PID 文件通常只有一个短数字和换行符,不需要读取整个文件。 使用固定大小的栈缓冲区避免动态内存分配。

if(ngx_close_file(file.fd)==NGX_FILE_ERROR){ngx_log_error(NGX_LOG_ALERT,cycle->log,ngx_errno,ngx_close_file_n" \"%s\" failed",file.name.data);}
关闭文件

if(n==NGX_ERROR){return1;}
若 读取操作出现错误 返回失败码 1

4 解析读取内容
while(n--&&(buf[n]==CR||buf[n]==LF)){/* void */}pid=ngx_atoi(buf,++n);if(pid==(ngx_pid_t)NGX_ERROR){ngx_log_error(NGX_LOG_ERR,cycle->log,0,"invalid PID number \"%*s\" in \"%s\"",n,buf,file.name.data);return1;}
#1 去除缓冲区尾部的换行符(CR 或 LF) 将 n(当前表示有效读取的字节总数)逐步减小, 跳过末尾所有的回车符(CR,\r)和换行符(LF,\n)。 循环结束后,n 恰好指向最后一个有效数字的索引,而非长度 #2 将修剪后的字符串转换为整数 PID ++n 是前置递增:将上一步得到的“末位索引”加 1,还原为有效字符串的实际长度。 #3 转换失败的错误处理

5 发送信号
returnngx_os_signal_process(cycle,sig,pid);}
完成 实际的、由操作系统执行的信号发送动作 并直接将执行结果作为退出码向上返回
http://www.jsqmd.com/news/646055/

相关文章:

  • LineageOS 22.1 编译 Winscope 实战:从环境配置到问题排查
  • 告别NAS软件!用Windows自带IIS+cpolar,5分钟搞定个人WebDAV网盘(附注册表修改避坑)
  • 2026年郑州汽车贴膜行业乱象与避坑指南白皮书 - 企业推荐官【官方】
  • 2025届毕业生推荐的十大AI论文助手实测分析
  • Kazumi番剧播放器终极指南:从零开始打造个性化动漫观看体验
  • DeerFlow任务调度:并行处理多个独立研究请求
  • HCPL-2612-300E,高共模抑制比线路接收器光耦合器
  • 上海新闻综合频道专题报道!老年活动假牙选对才安心,上海夕阳红口腔凭专业实力守护长辈 “齿” 间幸福 - 企业推荐官【官方】
  • 单车追风,十年专业:厦门趣骑单车综合品牌严选店的探索之路 - 企业推荐官【官方】
  • 从Windows开发到Linux生产:Kettle Carte服务跨平台部署的完整避坑指南
  • 终极Windows 11部署指南:让老旧硬件重获新生的完整方案
  • 避坑指南:Unity3D离线数字地球开发中的资源获取与优化技巧
  • Python实战:5步搞定AI数据集清洗与转换(附完整代码)
  • 广州财税公司全维度解析:2026年企业主必看的5家专业服务机构 - 小征每日分享
  • AlmaLinux 9.6必备工具链配置:EPEL+Docker CE源加速安装与开发环境调优实录
  • C#与CodeSoft实战:动态Label模板设计与批量打印标签
  • 线性代数术语词典:概念解释、词间关系、记忆要点
  • LITESTAR 4D:面向未来的唯一BIM文件-IFC!
  • 不止是本地测试:将Xinference部署的模型集成到Dify工作流,打造你的AI应用原型
  • QMC音频解码器:一键解锁加密音乐,实现跨平台播放自由
  • 2026届学术党必备的十大AI学术助手实际效果
  • 2026年深圳网站建设公司十大测评:技术设计服务全方位对比 - 速递信息
  • 2026年郑州新能源汽车贴膜专项白皮书 - 企业推荐官【官方】
  • 新能源知识库(45)6MWh液冷储能集装箱的技术突破与商业应用
  • KuGouMusicApi完整指南:构建专业的酷狗音乐服务API
  • FRED应用:MTF的计算
  • 别再只会用OAuth2.0登录了!手把手教你用Spring Security OAuth2 Client实现第三方资源访问(附GitHub API实战)
  • B站会员购自动化抢票工具:终极指南与完整使用教程
  • 2026 年华东上海大区养生品牌推荐榜单测评指南 - 企业推荐官【官方】
  • HCPL-263A-500E,HCMOS兼容、高共模抑制比10-MBd光耦合器