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

ngx_process_get_status

1 定义ngx_process_get_status 函数 定义在 ./nginx-1.24.0/src/os/unix/ngx_process.cstaticvoidngx_process_get_status(void){intstatus;char*process;ngx_pid_tpid;ngx_err_terr;ngx_int_ti;ngx_uint_tone;one0;for(;;){pidwaitpid(-1,status,WNOHANG);if(pid0){return;}if(pid-1){errngx_errno;if(errNGX_EINTR){continue;}if(errNGX_ECHILDone){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(errNGX_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;}one1;processunknown process;for(i0;ingx_last_process;i){if(ngx_processes[i].pidpid){ngx_processes[i].statusstatus;ngx_processes[i].exited1;processngx_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)2ngx_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].respawn0;}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;one0;one标记是否已成功回收过至少一个子进程 初始化 one 为 0表示尚未回收任何子进程。2 循环 回收子进程for(;;){pidwaitpid(-1,status,WNOHANG);调用 waitpid 回收进程 -1等待任意子进程。 status获取子进程终止状态。 WNOHANG非阻塞模式若无已终止子进程则立即返回 0。 返回值 0成功回收的子进程 PID。 0尚有子进程在运行但无已终止的子进程。 -1出错需检查 errno。if(pid0){return;}pid 0 表示当前没有子进程处于可回收状态。 说明所有已退出的子进程都已处理完毕安全退出循环。if(pid-1){errngx_errno;if(errNGX_EINTR){continue;}INTR 表示 waitpid() 被其他信号中断。 则重新尝试 waitpidif(errNGX_ECHILDone){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(errNGX_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 更新进程管理信息one1;processunknown process;#1 执行到这里说明 pid 0已成功回收一个子进程将 one 置为 1 后续再遇到 ECHILD 将直接返回。 #2 process unknown process 默认名称。如果 PID 不在 Nginx 进程表中则以此名称记录日志。for(i0;ingx_last_process;i){if(ngx_processes[i].pidpid){ngx_processes[i].statusstatus;ngx_processes[i].exited1;processngx_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)2ngx_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].respawn0;}#1 if (WTERMSIG(status)) { WTERMSIG 是一个用于解析进程退出状态的宏函数。 它的作用是从 wait 或 waitpid 函数返回的 status 参数中提取导致子进程异常终止的信号编号。 必须先通过 WIFSIGNALED(status) 确认子进程确实是被信号终止的 否则调用 WTERMSIG 的结果是未定义行为可能返回随机值或崩溃。 只有在 WIFSIGNALED(status) 宏返回真非零时 调用 WTERMSIG(status) 才有意义。WIFSIGNALED 用于判断子进程是否是被某个信号杀死的。 返回值返回 int 类型的信号编号 返回导致子进程终止的信号编号例如 SIGKILL 是 9SIGSEGV 是 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);}}解锁该子进程持有的所有互斥锁

相关文章:

ngx_process_get_status

1 定义 ngx_process_get_status 函数 定义在 ./nginx-1.24.0/src/os/unix/ngx_process.cstatic void ngx_process_get_status(void) {int status;char *process;ngx_pid_t pid;ngx_err_t err;ngx_int_t i;ngx_uint_t one;o…...

centos 配置国内yum源2026新

前言: 本文先讲述配置yum, 再讲述安装yum,因为一般系统会已经安装有yum了的,除非你的系统yum环境已经无效了的话,可以重新安装;可以直接输入指令yum-回车确认(如下述 安装-第6点)。 耗时一月收…...

Centos 7安装python3

耗时一月收集的学习资料,强烈建议学习一下 https://pan.quark.cn/s/b5638e1405d7 正文开始: 下面的操作,按照步骤来就可以了,不要在中途cd 到别的文件目录下,要想查看效果可以用 ls加上对应的目录,不需要…...

避坑指南:RT-Thread下LVGL移植的那些‘坑’——从显示异常、触摸失灵到内存优化实战

RT-Thread下LVGL移植实战:从显示异常到内存优化的全链路解决方案 在嵌入式GUI开发领域,LVGL凭借其轻量级和高度可定制性已成为众多开发者的首选。但当我们将这套优秀的图形库移植到RT-Thread实时操作系统时,往往会遇到一系列"坑"—…...

Linux命令:netstat

netstat 命令 基本介绍 netstat 命令用于显示网络状态,包括网络连接、路由表、接口统计等信息。它是 Linux 系统中常用的网络工具之一,用于监控网络连接和排查网络问题。 资料合集:https://pan.quark.cn/s/6fe3007c3e95、https://pan.quark.c…...

F2803x DSP ePWM模块实战:从基础配置到高精度电机控制

1. ePWM模块基础配置与电机控制入门 第一次接触F2803x的ePWM模块时,我完全被那些专业术语搞懵了。什么时基模块、比较模块、动作模块,听起来就像天书。但当我真正动手配置一个简单的电机驱动电路后,才发现这套系统设计得非常巧妙。下面我就用…...

避坑指南:STM32F407 ADC采集波形送到VOFA+显示,这些细节不注意波形会失真

STM32F407 ADC数据采集与VOFA波形显示优化实战 最近在调试STM32F407的ADC采集时,发现VOFA上显示的波形总是出现各种小问题——正弦波有毛刺、三角波出现阶梯状畸变、方波边缘抖动。这让我意识到,从ADC采样到上位机显示这条数据链路上,每个环节…...

别再乱用@staticmethod了!深入理解Python中类方法、静态方法与实例方法的区别与实战选择

别再乱用staticmethod了!深入理解Python中类方法、静态方法与实例方法的区别与实战选择 在Python开发中,类方法、静态方法和实例方法的区别看似简单,却经常成为代码评审时的争议焦点。我曾见过一个团队因为滥用staticmethod导致整个项目难以…...

典型相关分析(CCA)在多元数据融合与故障诊断中的实战应用与Python/Matlab实现

1. 典型相关分析(CCA)是什么?能解决什么问题? 典型相关分析(Canonical Correlation Analysis,简称CCA)是一种用于分析两组变量之间关系的多元统计方法。简单来说,它就像是一位擅长牵…...

Claude Opus 4.7 正式发布:Anthropic 在推理模型上的又一次突破

Anthropic CEO Dario Amodei 本周谈到 Project Glasswing,这是 Anthropic 联合 AWS、Apple、Google、Microsoft、NVIDIA 等公司发起的软件安全倡议。背景过去一周(4.10-4.17),AI 编程领域迎来了一波密集更新。Anthropic 发布 Clau…...

新鲜出炉!Claude Code之父亲授 Opus 4.7 最佳实践

Boris Cherny的opus 4.7最佳实践,教你如何利用重新校准的投入度级别、自适应思考功能以及全新的默认设置,全面优化你的代码工作流,快速适应opus 4.7这个模型。 Anthropic最新发布Opus 4.7。官方给出的定位是:目前正式上线的最强模…...

014、LangChain 入门到底先学什么?用一个知识库问答项目讲清 PromptTemplate、Chain 和 Output Parser

上一篇我们刚刚讲完,为什么很多做AI应用的人到了后面都会遇到LangChain。 但是真正开始学的时候,新的问题马上就会出现:知道LangChain重要,并不等于了解LangChain应该从哪里入手。 这也是很多人最容易被劝退的地方。一看到LangChain就会冒出一堆概念:Prompt、Chain、Run…...

面试官:堆外内存爆了,Dump 文件没用,你怎么定位?3招定位线上“幽灵内存泄漏”

如果是堆外内存(Direct Memory)溢出怎么办?我看监控面板,Heap用得很少,但机器的内存RSS一直在飙升,最后进程直接被Linux的OOM Killer杀掉了。用MAT打开Dump文件,里面啥也没有,这咋整…...

面试官:爆火视频点赞每秒 10w,数据库行锁直接卡死,你怎么破?

最近有个兄弟去面某短视频大厂,前面的架构设计聊得挺嗨,结果面试官最后抛出一个看似简单的“点赞”题,直接把他问到了自闭。 面试官: “现在有个爆火视频,比如春晚刘谦变魔术,一秒钟有 10 万人同时点赞。你…...

适合Bootstrap初学者的五个开源实战项目

...

如何在按需导入类时动态执行其内部代码

本文介绍如何利用 Python 3.7 的 __getattr__ 钩子机制,实现“仅在显式导入某个类时才执行其初始化逻辑”,避免模块级类定义时的副作用触发。 本文介绍如何利用 python 3.7 的 __getattr__ 钩子机制,实现“仅在显式导入某个类时才执行其…...

企业级自动化测试架构设计:Chrome for Testing 实现30%测试效率提升的完整方案

企业级自动化测试架构设计:Chrome for Testing 实现30%测试效率提升的完整方案 【免费下载链接】chrome-for-testing 项目地址: https://gitcode.com/gh_mirrors/ch/chrome-for-testing Chrome for Testing 是Google专门为Web应用测试和自动化场景设计的Chr…...

3个元数据管理难题,如何用可视化工具优雅解决?

3个元数据管理难题,如何用可视化工具优雅解决? 【免费下载链接】ExifToolGui A GUI for ExifTool 项目地址: https://gitcode.com/gh_mirrors/ex/ExifToolGui 照片元数据管理常常让人望而生畏:面对数百张旅行照片需要统一调整拍摄时间…...

ConvLSTM核心代码逐行解读:从PyTorch实现到自定义数据集加载的避坑指南

ConvLSTM核心代码逐行解读:从PyTorch实现到自定义数据集加载的避坑指南 时空序列预测是计算机视觉和深度学习领域的重要课题。ConvLSTM作为传统LSTM的扩展,通过引入卷积操作,能够同时捕捉时间和空间维度的特征。本文将深入解析ConvLSTM的PyTo…...

Smithbox终极指南:零基础打造你的专属魂系游戏世界

Smithbox终极指南:零基础打造你的专属魂系游戏世界 【免费下载链接】Smithbox Smithbox is a modding tool for Elden Ring, Armored Core VI, Sekiro, Dark Souls 3, Dark Souls 2, Dark Souls, Bloodborne and Demons Souls. 项目地址: https://gitcode.com/gh_…...

DevOps CI/CD完整流水线实战:从代码提交到生产部署

摘要现代软件开发的核心竞争力在于持续交付能力。一个完善的CI/CD流水线能够将代码从开发者的本地环境安全、可靠、高效地输送到生产环境。本文详细讲解完整的七阶段流水线:代码检查、单元测试、构建、安全扫描、集成测试、预发布、生产部署。通过GitHub Actions、K…...

LeetCode高频算法精讲:大厂面试知识体系完全指南

算法面试是互联网大厂招聘的核心环节,掌握高频题型和解题模板是通关关键。本文系统讲解LeetCode上的五大高频题型:二分查找、滑动窗口、DFS/BFS、动态规划和贪心算法。每种算法包含原理讲解、标准模板、变体应对和复杂度分析,配合大量完整代码…...

如何快速掌握NIF文件编辑:面向游戏开发者的完整NifSkope指南

如何快速掌握NIF文件编辑:面向游戏开发者的完整NifSkope指南 【免费下载链接】nifskope A git repository for nifskope. 项目地址: https://gitcode.com/gh_mirrors/ni/nifskope NifSkope是一款强大的开源工具,专门用于打开和编辑NetImmerse文件…...

【仅限首批技术负责人开放】:Gartner认证的「生成-审查」双闭环成熟度模型(含自评矩阵与6个月跃迁路径图)

第一章:智能代码生成与代码审查流程整合 2026奇点智能技术大会(https://ml-summit.org) 现代软件工程实践中,智能代码生成已不再孤立运行于开发环境边缘,而是深度嵌入持续集成与代码审查(CI/CR)主干流程。当开发者提交…...

为什么你的Copilot总“写偏”?揭秘LLM提示工程×IDE语义感知的4层对齐机制

第一章:智能代码生成与IDE集成方案 2026奇点智能技术大会(https://ml-summit.org) 现代开发工作流正经历由大语言模型驱动的范式迁移,智能代码生成已从实验性插件演进为IDE原生能力的核心组件。主流集成方案聚焦于低延迟响应、上下文感知补全与安全可控…...

2026届必备的十大AI学术网站解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 知网已正式推出AIGC检测服务系统,此系统目的在于识别学术文本里由人工智能生成的…...

2025届学术党必备的降重复率方案推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 要降低AIGC检测率,需从文本特征着手。首先,得对词汇多样性予以调整&…...

目前的人脸识别水平

这个图片需要稍微旋转手机才能识别出来,因为他脸比较小,而且他照片拍的时候就是有一定角度的,精准识别核心区域似乎只要是正面的脸,角度对,就没问题了。现在试试看侧面:一般情况应该是够用了。...

app找到人脸已经非常轻松了

缺陷: 从这个3个图片可以看出:他的人脸位置不准确: 第一个图片:下巴没有计算进去 第二个图片:额头不完整 第三个图:左边脸明显不完整。 也就是说现在的这个算法可能也就用来玩还是可以的。如果真的用于…...

避坑指南:osg与osgEarth版本搭配那些事儿,从编译失败到成功显示地球

三维地理可视化开发实战:OSG与osgEarth版本适配深度解析 引言:版本兼容性问题的普遍困境 在三维地理信息系统开发领域,OpenSceneGraph(OSG)和osgEarth的组合堪称黄金搭档,但许多开发者在环境搭建的第一步——编译环节就遭遇了滑铁…...