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

ngx_process_get_status

1 定义

ngx_process_get_status 函数 定义在 ./nginx-1.24.0/src/os/unix/ngx_process.c
staticvoidngx_process_get_status(void){intstatus;char*process;ngx_pid_tpid;ngx_err_terr;ngx_int_ti;ngx_uint_tone;one=0;for(;;){pid=waitpid(-1,&status,WNOHANG);if(pid==0){return;}if(pid==-1){err=ngx_errno;if(err==NGX_EINTR){continue;}if(err==NGX_ECHILD&&one){return;}/* * Solaris always calls the signal handler for each exited process * despite waitpid() may be already called for this process. * * When several processes exit at the same time FreeBSD may * erroneously call the signal handler for exited process * despite waitpid() may be already called for this process. */if(err==NGX_ECHILD){ngx_log_error(NGX_LOG_INFO,ngx_cycle->log,err,"waitpid() failed");return;}ngx_log_error(NGX_LOG_ALERT,ngx_cycle->log,err,"waitpid() failed");return;}one=1;process="unknown process";for(i=0;i<ngx_last_process;i++){if(ngx_processes[i].pid==pid){ngx_processes[i].status=status;ngx_processes[i].exited=1;process=ngx_processes[i].name;break;}}if(WTERMSIG(status)){#ifdefWCOREDUMPngx_log_error(NGX_LOG_ALERT,ngx_cycle->log,0,"%s %P exited on signal %d%s",process,pid,WTERMSIG(status),WCOREDUMP(status)?" (core dumped)":"");#elsengx_log_error(NGX_LOG_ALERT,ngx_cycle->log,0,"%s %P exited on signal %d",process,pid,WTERMSIG(status));#endif}else{ngx_log_error(NGX_LOG_NOTICE,ngx_cycle->log,0,"%s %P exited with code %d",process,pid,WEXITSTATUS(status));}if(WEXITSTATUS(status)==2&&ngx_processes[i].respawn){ngx_log_error(NGX_LOG_ALERT,ngx_cycle->log,0,"%s %P exited with fatal code %d ""and cannot be respawned",process,pid,WEXITSTATUS(status));ngx_processes[i].respawn=0;}ngx_unlock_mutexes(pid);}}
ngx_process_get_status 函数是 它是 Nginx 处理子进程退出状态的核心函数, 通常作为 SIGCHLD 信号的处理函数被调用

2 详解

1 函数签名

staticvoidngx_process_get_status(void)
无参数和返回值

2 逻辑流程

1 局部变量 2 循环 回收子进程 3 更新进程管理信息 4 日志记录 5 释放锁

1 局部变量
{intstatus;char*process;ngx_pid_tpid;ngx_err_terr;ngx_int_ti;ngx_uint_tone;one=0;
one:标记是否已成功回收过至少一个子进程 初始化 one 为 0,表示尚未回收任何子进程。

2 循环 回收子进程
for(;;){pid=waitpid(-1,&status,WNOHANG);
调用 waitpid 回收进程 -1:等待任意子进程。 &status:获取子进程终止状态。 WNOHANG:非阻塞模式,若无已终止子进程则立即返回 0。 返回值: > 0:成功回收的子进程 PID。 0:尚有子进程在运行,但无已终止的子进程。 -1:出错(需检查 errno)。

if(pid==0){return;}
pid == 0 表示当前没有子进程处于可回收状态。 说明所有已退出的子进程都已处理完毕,安全退出循环。

if(pid==-1){err=ngx_errno;if(err==NGX_EINTR){continue;}
INTR 表示 waitpid() 被其他信号中断。 则重新尝试 waitpid

if(err==NGX_ECHILD&&one){return;}
ECHILD 表示“没有子进程”。 one == 1 表示已经成功回收过至少一个子进程。 如果已经成功回收过至少一个子进程(one == 1), 且仍收到 ECHILD,说明是操作系统对已回收进程的冗余信号通知(见下方注释), 此时可安全退出循环。 这是对 Solaris/FreeBSD 特殊行为的规避。

/* * Solaris always calls the signal handler for each exited process * despite waitpid() may be already called for this process. * * When several processes exit at the same time FreeBSD may * erroneously call the signal handler for exited process * despite waitpid() may be already called for this process. */if(err==NGX_ECHILD){ngx_log_error(NGX_LOG_INFO,ngx_cycle->log,err,"waitpid() failed");return;}
#1 注释说明:Solaris 和 FreeBSD 等系统存在信号投递的“过度调用”问题 (同一个退出事件可能多次触发 SIGCHLD,或所有子进程都已回收后仍触发信号) Nginx 必须兼容这些历史行为。 #2 此时 one == 0 且 err == ECHILD,说明一个子进程都没回收,但系统报告无子进程。 这通常是上述 OS quirks 导致的,属于预期内的边界情况,记录 INFO 日志后返回。

ngx_log_error(NGX_LOG_ALERT,ngx_cycle->log,err,"waitpid() failed");return;}
其他非预期错误(如 EINVAL、EFAULT 等),记录 ALERT 级别日志并返回。

3 更新进程管理信息
one=1;process="unknown process";
#1 执行到这里说明 pid > 0,已成功回收一个子进程,将 one 置为 1 后续再遇到 ECHILD 将直接返回。 #2 process = "unknown process": 默认名称。如果 PID 不在 Nginx 进程表中,则以此名称记录日志。

for(i=0;i<ngx_last_process;i++){if(ngx_processes[i].pid==pid){ngx_processes[i].status=status;ngx_processes[i].exited=1;process=ngx_processes[i].name;break;}}
遍历 ngx_processes 全局数组: ngx_last_process 是当前已创建的进程槽位数。 匹配到 PID 后: 保存子进程的退出状态 status。 标记 exited = 1,表示该进程已退出 获取该进程名称(例如 "worker process"、"cache manager process"),用于日志输出。 若未找到匹配项,process 仍为 "unknown process",这通常不应发生,但作为一种防御性编程存在。

4 日志记录
if(WTERMSIG(status)){#ifdefWCOREDUMPngx_log_error(NGX_LOG_ALERT,ngx_cycle->log,0,"%s %P exited on signal %d%s",process,pid,WTERMSIG(status),WCOREDUMP(status)?" (core dumped)":"");#elsengx_log_error(NGX_LOG_ALERT,ngx_cycle->log,0,"%s %P exited on signal %d",process,pid,WTERMSIG(status));#endif}else{ngx_log_error(NGX_LOG_NOTICE,ngx_cycle->log,0,"%s %P exited with code %d",process,pid,WEXITSTATUS(status));}if(WEXITSTATUS(status)==2&&ngx_processes[i].respawn){ngx_log_error(NGX_LOG_ALERT,ngx_cycle->log,0,"%s %P exited with fatal code %d ""and cannot be respawned",process,pid,WEXITSTATUS(status));ngx_processes[i].respawn=0;}
#1 if (WTERMSIG(status)) { WTERMSIG 是一个用于解析进程退出状态的宏函数。 它的作用是从 wait 或 waitpid 函数返回的 status 参数中,提取导致子进程异常终止的信号编号。 必须先通过 WIFSIGNALED(status) 确认子进程确实是被信号终止的, 否则调用 WTERMSIG 的结果是未定义行为(可能返回随机值或崩溃)。 只有在 WIFSIGNALED(status) 宏返回真(非零)时, 调用 WTERMSIG(status) 才有意义。WIFSIGNALED 用于判断子进程是否是被某个信号杀死的。 返回值:返回 int 类型的信号编号 返回导致子进程终止的信号编号(例如 SIGKILL 是 9,SIGSEGV 是 11)。 返回 0 子进程正常退出时: 子进程通过 exit() 等方式自然结束,而非被信号杀死 此 if 判断子进程是否因信号而异常终止。
#2 记录因信号退出的日志(级别 ALERT):
#3 若未被信号终止,则为正常退出 记录正常退出日志(级别 NOTICE):
#4 特殊退出码处理 Nginx 约定退出码 2 表示“致命错误” 将 respawn = 0,关闭自动重启机制 WEXITSTATUS 是一个用于解析进程退出状态的宏函数。 它的作用是从 wait 或 waitpid 返回的 status 值中, 提取子进程正常退出时的退出码(即 exit(n) 中的 n 或 main 函数的返回值)。

5 释放锁
ngx_unlock_mutexes(pid);}}
解锁该子进程持有的所有互斥锁
http://www.jsqmd.com/news/658166/

相关文章:

  • 2026年第二季度南宁瓷砖防水工程服务商综合评估与选型指南 - 2026年企业推荐榜
  • 10.机器学习——马尔科夫模型实战:从天气预测到股市分析
  • 2026年4月玻璃钢管道市场格局透视:五大**服务商综合评估与首选推荐 - 2026年企业推荐榜
  • V-Scale-Screen实战:从零构建自适应大屏可视化系统
  • 告别手动点点点:用Python+pywinauto/pyautogui给Windows软件做个自动化小助手(保姆级教程)
  • 手机存储性能调优:深入理解UFS命令队列与Task Management机制
  • LeetCode高频算法精讲:大厂面试知识体系完全指南
  • ngx_unlock_mutexes
  • 下一代视频智能对比引擎:video-compare的技术革命与架构创新
  • 2026年塑料喷壶技术变革:五大源头厂家实力解析与选型指南 - 2026年企业推荐榜
  • Windows 10 + VS2019 保姆级教程:从零编译PaddleOCR C++ CPU推理库(含中文乱码解决方案)
  • 2026年至今,广州企业如何选择专业劳务外包服务商?一份深度决策指南 - 2026年企业推荐榜
  • 为什么92%的生成式AI产品画像失效?——头部AIGC平台验证的4层动态标签体系
  • DevOps CI/CD完整流水线实战:从代码提交到生产部署
  • 2026年4月更新:台州果汁饮料瓶厂商综合评估与定制化服务指南 - 2026年企业推荐榜
  • WRF运行wrf.exe遭遇forrtl: severe (174): SIGSEGV段错误排查与修复全攻略
  • Smithbox终极指南:零基础打造你的专属魂系游戏世界
  • 自动化测试中Python操作Excel
  • 最后一批未部署AI编程助手的团队正在失去什么?2024Q2行业落地率已达73.8%,你还在手动补全?
  • app找到人脸已经非常轻松了
  • 2026年现阶段,不锈钢螺丝行业选型指南:从浙江看全国领军者 - 2026年企业推荐榜
  • Windows服务管理神器:除了NSSM,试试Apache Commons Daemon的prunmgr图形化监控工具
  • 2026年网络安全威胁全景:AI攻防新纪元完全指南
  • 2026年4月石家庄铺路铁板租赁市场深度测评:北京顺建源如何赢得口碑? - 2026年企业推荐榜
  • AI应用搜索流量归零前的最后72小时:一线技术团队已启动的5步紧急复苏协议(含Prompt+Schema+Embedding三重校准)
  • 目前的人脸识别水平
  • python git-cliff
  • 2026年至今,池州高性价比路灯采购全攻略与五大品牌深度解析 - 2026年企业推荐榜
  • 2025届学术党必备的降重复率方案推荐榜单
  • 2026年4月更新:白桦树汁浓缩液生产厂家选型指南与深度解析 - 2026年企业推荐榜