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

ngx_create_pidfile

1 定义ngx_create_pidfile 函数 定义在 ./nginx-1.24.0/src/core/ngx_cycle.cngx_int_tngx_create_pidfile(ngx_str_t*name,ngx_log_t*log){size_tlen;ngx_int_trc;ngx_uint_tcreate;ngx_file_tfile;u_char pid[NGX_INT64_LEN2];if(ngx_processNGX_PROCESS_MASTER){returnNGX_OK;}ngx_memzero(file,sizeof(ngx_file_t));file.name*name;file.loglog;createngx_test_config?NGX_FILE_CREATE_OR_OPEN:NGX_FILE_TRUNCATE;file.fdngx_open_file(file.name.data,NGX_FILE_RDWR,create,NGX_FILE_DEFAULT_ACCESS);if(file.fdNGX_INVALID_FILE){ngx_log_error(NGX_LOG_EMERG,log,ngx_errno,ngx_open_file_n \%s\ failed,file.name.data);returnNGX_ERROR;}rcNGX_OK;if(!ngx_test_config){lenngx_snprintf(pid,NGX_INT64_LEN2,%P%N,ngx_pid)-pid;if(ngx_write_file(file,pid,len,0)NGX_ERROR){rcNGX_ERROR;}}if(ngx_close_file(file.fd)NGX_FILE_ERROR){ngx_log_error(NGX_LOG_ALERT,log,ngx_errno,ngx_close_file_n \%s\ failed,file.name.data);}returnrc;}用于创建或更新 nginx 的 PID 文件 将当前主进程的进程号PID写入指定文件。2 详解1 函数签名ngx_int_tngx_create_pidfile(ngx_str_t*name,ngx_log_t*log)返回值 该函数返回一个状态码 NGX_OK为 0表示成功。 NGX_ERROR为 -1表示失败。参数 参数 1ngx_str_t *name 指定 PID 文件的路径和文件名 参数 2ngx_log_t *log 提供日志上下文2 逻辑流程1 局部变量 2 进程类型判断 3 初始化文件结构 4 设置文件打开标志 5 打开或创建PID 文件 6 写入 PID 7 返回处理结果状态码1 局部变量{size_tlen;ngx_int_trc;ngx_uint_tcreate;ngx_file_tfile;u_char pid[NGX_INT64_LEN2];NGX_INT64_LEN Nginx 宏定义表示 64 位整数转换为十进制字符串所需的最大字符数 值为 (sizeof(-9223372036854775808) - 1) 通常是 20。 1用于存储换行符 \nPID 文件惯例以换行结尾。 1用于存储字符串结束符 \0C 字符串标准。 合计 2。 作用作为格式化 PID 字符串的缓冲区。2 进程类型判断if(ngx_processNGX_PROCESS_MASTER){returnNGX_OK;}#1 ngx_process 这是一个全局变量表示当前进程的类型。 NGX_PROCESS_MASTER 这是一个宏定义常量代表主进程的类型标识。#2 检查当前进程的类型标识是否大于主进程标识。 由于 NGX_PROCESS_MASTER 通常为 0而其他进程类型大于 0 这个判断等价于“当前进程是不是主进程” 如果条件成立是真说明当前是子进程Worker 或 Helper。 如果条件不成立是假说明当前是主进程。 提前返回return NGX_OK; 如果是子进程直接结束函数返回 NGX_OK成功。 如果是主进程跳过此 if 块继续执行后续的文件打开和写入逻辑。#3 为什么只有主进程创建 PID 文件 PID 文件通常是 nginx.pid用于记录主进程的进程 ID 以便外部管理工具如 nginx -s reload、nginx -s stop能够通过向该 PID 发送信号来控制 nginx。 如果由工作进程写入 PID 文件那么外部信号将发送给工作进程 而工作进程不会处理 reload、stop 等控制信号这些信号应由主进程处理从而导致管理命令失效。3 初始化文件结构ngx_memzero(file,sizeof(ngx_file_t));file.name*name;file.loglog;将 file 结构体所占用的内存全部清零 将传入的路径字符串name赋值给文件结构的 name 成员 将日志指针赋值给文件结构的 log 成员4 设置文件打开标志createngx_test_config?NGX_FILE_CREATE_OR_OPEN:NGX_FILE_TRUNCATE;根据是否处于配置测试模式设置文件打开标志。 ngx_test_config 是一个全局标志 当 nginx 以 -t 参数启动时被设置为非零值表示仅测试配置文件不实际运行服务。 若处于测试模式使用 NGX_FILE_CREATE_OR_OPEN打开或创建文件但不截断。 否则使用 NGX_FILE_TRUNCATE打开并截断文件清空原有内容。 意义 测试模式下的保护 测试配置时可能系统中已有正在运行的 nginx 实例其 PID 文件不能被覆盖或清空。 使用 NGX_FILE_CREATE_OR_OPEN 可以保留原有内容仅验证文件是否可写 避免破坏正在运行的 nginx 的管理入口。 正常启动时的正确行为 正常启动时需要将当前主进程的 PID 写入文件 因此先用 NGX_FILE_TRUNCATE 清空文件 确保文件中只有最新的 PID且不包含旧数据。5 打开或创建PID 文件file.fdngx_open_file(file.name.data,NGX_FILE_RDWR,create,NGX_FILE_DEFAULT_ACCESS);if(file.fdNGX_INVALID_FILE){ngx_log_error(NGX_LOG_EMERG,log,ngx_errno,ngx_open_file_n \%s\ failed,file.name.data);returnNGX_ERROR;}rcNGX_OK;调用 nginx 封装的 open 函数实际打开或创建PID 文件并返回文件描述符。 参数解析 file.name.data文件路径字符串以 \0 结尾。 NGX_FILE_RDWR以读写方式打开虽然只进行写入但有些系统要求读写才能截断。 create上一步确定的打开标志NGX_FILE_CREATE_OR_OPEN 或 NGX_FILE_TRUNCATE。 NGX_FILE_DEFAULT_ACCESS默认权限通常是 0644即所有者可读写组和其他只读。检查 ngx_open_file 是否失败若失败则记录错误并返回。初始化返回状态为成功6 写入 PIDif(!ngx_test_config){lenngx_snprintf(pid,NGX_INT64_LEN2,%P%N,ngx_pid)-pid;if(ngx_write_file(file,pid,len,0)NGX_ERROR){rcNGX_ERROR;}}if(ngx_close_file(file.fd)NGX_FILE_ERROR){ngx_log_error(NGX_LOG_ALERT,log,ngx_errno,ngx_close_file_n \%s\ failed,file.name.data);}#1 非测试模式 格式化 PID 字符串 写入文件并更新返回码 若写入成功函数返回 NGX_OK 若失败返回 NGX_ERROR并记录详细错误如磁盘满、权限不足等。 写入失败时将局部变量 rc 改为 NGX_ERROR。 rc 先前已被初始化为 NGX_OK用于记录最终返回状态。 这样即使写入失败也会继续执行后续的关闭操作避免资源泄漏。 为什么写入失败不立即返回 文件描述符必须被关闭无论写入是否成功。 因此函数需要继续执行关闭逻辑最后统一返回 rc 的值。 #2 关闭文件描述符7 返回处理结果状态码returnrc;}

相关文章:

ngx_create_pidfile

1 定义 ngx_create_pidfile 函数 定义在 ./nginx-1.24.0/src/core/ngx_cycle.cngx_int_t ngx_create_pidfile(ngx_str_t *name, ngx_log_t *log) {size_t len;ngx_int_t rc;ngx_uint_t create;ngx_file_t file;u_char pid[NGX_INT64_LEN 2];if (ngx_process >…...

Windows 11界面自定义终极指南:使用ExplorerPatcher恢复经典体验

Windows 11界面自定义终极指南:使用ExplorerPatcher恢复经典体验 【免费下载链接】ExplorerPatcher 提升Windows操作系统下的工作环境 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher 还在为Windows 11 24H2的新界面感到不适&#xff1f…...

ProDino MKR Zero工业RS-485与LoRaWAN开发指南

1. ProDino MKR Zero 硬件平台与配套库深度解析ProDino MKR Zero 是 KMP(KMP Electronics)面向工业物联网边缘节点推出的紧凑型 ARM Cortex-M0 开发平台,基于 Microchip SAMD21G18A 微控制器(48MHz 主频、256KB Flash、32KB SRAM&…...

Qwen3-ForcedAligner-0.6B效果实测:不同方言口音(潮汕/客家/闽南)识别对比

Qwen3-ForcedAligner-0.6B效果实测:不同方言口音(潮汕/客家/闽南)识别对比 1. 引言:当AI语音识别遇上“十里不同音” 你有没有遇到过这样的尴尬?用手机语音转文字,自己明明说的是普通话,结果出…...

Instagram数据提取完全指南:Toutatis实战揭秘与高效应用

Instagram数据提取完全指南:Toutatis实战揭秘与高效应用 【免费下载链接】toutatis Toutatis is a tool that allows you to extract information from instagrams accounts such as e-mails, phone numbers and more 项目地址: https://gitcode.com/GitHub_Trend…...

X-NUCLEO-IHM02A1双步进电机驱动开发与L6470嵌入式控制实践

1. X-NUCLEO-IHM02A1 电机控制扩展板技术解析与嵌入式驱动开发实践X-NUCLEO-IHM02A1 是意法半导体(STMicroelectronics)推出的高性能双通道步进电机驱动扩展板,专为 STM32 Nucleo 开发平台设计。该板基于 L6470 智能功率级芯片构建&#xff0…...

嵌入式硬件工程师如何转型管理者

嵌入式硬件工程师的职业发展路径:从技术专家到管理者的转型指南1. 职业发展概述1.1 技术与管理双轨发展在嵌入式硬件工程领域,职业发展通常呈现两条路径:技术专家路线和管理路线。对于希望转向管理岗位的工程师,需要理解技术能力与…...

【2026年小红书春招- 3月25日 -第三题- 字符置换】(题目+思路+JavaC++Python解析+在线测试)

题目内容 为了提升小红书笔记标签的可读性,我们计划对标签字符串进行一次双向字符置换操作,以获得更小的字典序结果。 具体地,给定一个长度为 nnn 的字符串 sss(下标从 $1 开始),你可以进行一次如下操作:选取三个整数开始),你可以进行一次如下操作: 选取三个整数...

【2026年小红书春招- 3月25日 -第二题- 互评操作】(题目+思路+JavaC++Python解析+在线测试)

题目内容 现在有 n n n 条$ Plog$ 在首页上排成一列,队尾在下侧,队头在上侧。 用长度为 n n n 的$ 01 $串 s = s 1 , s 2 , … , s n s=s_1,s_2,…,s_n...

【2026年小红书春招- 3月25日 -第一题- 数据库】(题目+思路+JavaC++Python解析+在线测试)

题目内容 小红书数据库中有用户编号、用户名称和用户经验三个字段,其中: 用户编号为 111 到 10910^910...

分布式能力不是功能,而是一种架构约束

网罗开发(小红书、快手、视频号同名)大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方…...

Au新手入门指南:从零开始掌握音频编辑基础

1. 认识Adobe Audition:你的第一把音频手术刀 第一次打开Adobe Audition(简称Au)时,满屏的波形图和专业术语可能会让你头皮发麻。别担心,这就像第一次拿手术刀的外科实习生——工具看起来很专业,但基础操作…...

保姆级教程:用Qt搞定蓝牙串口通信,从连接云台到指令队列完整流程

保姆级教程:用Qt实现蓝牙串口通信全流程实战 在智能硬件开发领域,蓝牙串口通信就像一座连接数字世界与物理世界的桥梁。想象一下,你手中的Qt程序能够通过简单的指令让云台精准转动,或者让智能小车按照预定路线行驶——这种"软…...

叠层母排市场洞察:至2032年将攀升至近101.7亿元

据恒州诚思调研统计,2025年全球叠层母排收入规模约34.63亿元,至2032年将攀升至近101.7亿元,2026-2032年复合增长率(CAGR)达14.2%。这一增长受新能源汽车电驱系统、风光储变流器等电力电子领域需求爆发驱动,…...

新概念英语第一册083_Going on holiday

Lesson 83: Going on holiday Watch the story and answer the question Where did Sam go for his holiday this year? He stayed at home.Key words and expressions mess n. 杂乱,pack v. 包装,打包,装箱suitcase …...

【数据结构与算法】第5篇:线性表(一):顺序表(ArrayList)的实现与应用

一、什么是顺序表顺序表是最简单的一种线性结构。用一段地址连续的存储单元依次存储数据元素。你可以把它理解为一个可以自动扩容的数组。C语言的原生数组长度是固定的,不够用的时候只能重新申请更大的数组,把数据搬过去。顺序表封装了这个过程&#xff…...

告别WSL1!手把手教你将WSL升级到WSL2,并更新Linux内核到最新版(2024保姆级教程)

2024终极指南:从WSL1无缝迁移至WSL2并升级Linux内核 如果你还在使用WSL1,可能会遇到Docker运行缓慢、文件系统操作卡顿等问题。WSL2带来了完整的Linux内核支持,性能提升显著。本文将带你完成从WSL1到WSL2的完整迁移,并确保你的Li…...

RT-Thread线程管理与调度机制详解

RT-Thread线程管理深度解析1. 嵌入式实时操作系统中的线程概念在嵌入式实时操作系统(RTOS)中,线程是最基本的调度单位,也被称为任务。与裸机编程的单线程模式不同,RTOS通过多线程机制实现了任务的并发执行。裸机系统通常采用一个无限循环结构…...

Chat模型微调实战:基于AI辅助开发的高效调参指南

最近在做一个智能客服项目,需要基于一个预训练的Chat模型进行微调,以适应我们特定的业务对话场景。一开始,我天真地以为微调就是改改学习率、跑几轮训练那么简单,结果很快就陷入了“调参地狱”。手动调整超参数不仅耗时&#xff0…...

从物流仓库到游戏背包:三维装箱问题(3D-BPP)如何影响你的日常生活?

从物流仓库到游戏背包:三维装箱问题如何塑造我们的数字生活 清晨打开手机里的策略游戏,你发现背包格子又不够用了——那些珍贵的装备和药水总是无法完美摆放;周末搬家时,面对满屋的家具和纸箱,你突然意识到小货车可能装…...

3步实现游戏ROM高效管理:RomM自托管解决方案完整指南

3步实现游戏ROM高效管理:RomM自托管解决方案完整指南 【免费下载链接】romm A beautiful, powerful, self-hosted rom manager 项目地址: https://gitcode.com/GitHub_Trending/rom/romm 游戏ROM管理是每位怀旧游戏爱好者的必修课,但面对成千上万…...

Virtual-Display-Driver终极指南:Windows虚拟显示器驱动完整配置与优化教程

Virtual-Display-Driver终极指南:Windows虚拟显示器驱动完整配置与优化教程 【免费下载链接】Virtual-Display-Driver Add virtual monitors to your windows 10/11 device! Works with VR, OBS, Sunshine, and/or any desktop sharing software. 项目地址: https…...

HMC5883L地磁传感器驱动开发与AHRS融合实战

1. HMC5883L地磁传感器技术深度解析与嵌入式驱动开发实践 1.1 器件定位与工程价值 HMC5883L是由Honeywell(霍尼韦尔)推出的三轴数字地磁罗盘传感器,采用各向异性磁阻(AMR)技术,专为高精度电子罗盘、姿态检…...

RuoYi-Vue-Plus:现代化企业级开发框架的架构演进与分布式多租户解决方案

RuoYi-Vue-Plus:现代化企业级开发框架的架构演进与分布式多租户解决方案 【免费下载链接】RuoYi-Vue-Plus 项目地址: https://gitcode.com/GitHub_Trending/ru/RuoYi-Vue-Plus 面对企业应用开发中普遍存在的分布式架构复杂性、多租户数据隔离难题以及传统框…...

Folo信息整理神器:如何告别碎片化阅读,轻松构建专属知识库?

Folo信息整理神器:如何告别碎片化阅读,轻松构建专属知识库? 【免费下载链接】follow [WIP] Next generation information browser 项目地址: https://gitcode.com/GitHub_Trending/fol/follow 每天被数十个APP推送轰炸,有价…...

告别Anaconda臃肿安装!用VSCode+Miniconda打造轻量级Python数据分析环境

轻量级Python数据分析环境:VSCodeMiniconda高效组合方案 为什么需要告别Anaconda? 在数据科学领域,开发环境的效率直接影响工作产出。传统Anaconda发行版虽然功能全面,但其庞大的体积(通常超过3GB)和缓慢…...

STM32智能猪舍监控系统设计与实现

基于STM32的智能猪舍监控系统设计1. 项目概述1.1 系统背景现代养殖业正经历从传统人工管理向智能化管理的转型过程。在生猪养殖领域,环境参数如温湿度、空气质量、光照强度等对猪只健康生长具有决定性影响。传统人工监测方式存在响应滞后、精度不足等问题&#xff0…...

手把手教你用BurpSuite抓取火狐浏览器数据包(含代理设置完整流程)

从零掌握BurpSuite抓包:火狐浏览器配置与实战技巧 在Web安全测试领域,BurpSuite无疑是渗透测试工程师和开发者的瑞士军刀。不同于简单的网络调试工具,它提供了从基础抓包到高级漏洞探测的全套解决方案。本文将带你从环境搭建到实战抓包&#…...

嵌入式系统协议兼容性设计与升级优化

嵌入式系统中的协议兼容性设计与升级策略1. 多板系统中的通信协议挑战在现代嵌入式系统设计中,硬件架构往往由多块控制板协同工作构成。这种分布式架构带来了通信协议设计上的特殊挑战,特别是在系统升级和维护阶段。1.1 典型应用场景分析多板系统通常面临…...

告别手动组帧!用libmodbus库5分钟搞定Modbus RTU设备数据读取(C语言实战)

5分钟极速上手:用libmodbus高效读取工业设备数据的C语言实践指南 在工业自动化现场,当我们需要快速对接一台陌生的Modbus RTU设备时,传统的手动组帧方式往往让开发者陷入繁琐的字节操作和CRC校验计算中。我曾亲眼见过一位工程师花费三天时间调…...