揭秘僵尸进程:父进程为何必须等待子进程
进程等待进程等待必要性为什么之前讲过子进程退出父进程如果不管不顾就会造成僵尸进程的问题进而造成内存泄漏。另外进程一旦变成僵尸进程进程停止运行不被CPU调度进程只剩下PID和退出码就难以杀死kill -9都没办法因为谁也没用办法去杀死一个已经死去的进程kill -9是信号但是僵尸进程无法被CPU调用就无法接收信号就难以被清理最后父进程派给子进程的任务完成的如何我们需要知道父进程通过进程等待的方式回收子进程资源子进程进程资源 内核级资源、最重要获取子进程退出消息(可选)。进程死亡 进程终止 进程资源回收子进程终止父进程不处理就是不做资源回收子进程就成为僵尸进程了 这也是为什么要进程等待僵尸进程的危害会但用PID资源导致新进程无法创建进程等待的方法是什么父进程创建出子进程后父进程必须要想办法通过上面的接口来等待子进程所以父进程通过使用wait和waitpid的操作就是进程等待通过代码来验证一个是否会产生僵尸进程确实产生了僵尸进程通过进程等待的方式来回收子进程解决僵尸进程这里通过wait来验证我们先来讲讲waitwait函数参数是输出型参数给wait函数传输一个整型变量地址用来存储子进程退出码函数调用成功后父进程就可以通过这个wstatus指针来获取退出码wait()wait是等待那个进程呢是等待任意一个退出的子进程父进程创建一个子进程就等待这一个子进程若创建10个子进程wait就会阻塞掉直到这10个子进程中任意一个退出了就返回那个退出的子进程解决子进程僵尸问题wait函数返回值是回收成功子进程的PID即目标僵尸进程的PID若失败就返回-1如果等待子进程子进程没有退出父进程会阻塞在wait调用处(与scanf同理)可以看到wait回收僵尸进程成功waitpid()这里wait 是简单版等待如果想要获得更多的子进程信息可以使用waitpidpid_t waitpid(pid_t pid,int *wstatus, int options);等待成功返回值是子进程PIDwstatus为输出型参数父进程可以通过这个指针获得子进程的退出码optione是阻塞控制pid为父进程需要等待的子进程pid大于0表示传进来的PID是谁父进程就等这个子进程等于-1 就等价于wait等待任意一个退出的子进程0和小于-1暂时不了解所以上面的案例使用waitpid也可以并且上图这样写id可以写-1-1就和wait一样了效果一致wait/waitpid失败的原因1、进程本身没有子进程2、waitpid传pid参数传错了通过上图案例来看看等待失败的情况我们手动的将子进程的PID1对rid返回值小于0的情况做判断int *wstatus参数这个参数为输出型参数我们知道函数返回数据有两种方式return返回还有一种就是指针传参返回传入指针在函数内部对指针指向地址存储同样达到了return这样向外输出的操作父进程要通过waitpid来获取子进程的退出信息如何评估这个退出信息呢这就是为什么我们要先讲解进程退出了根据进程退出码即main函数返回值来评估我们来试试我们子进程退出码为1wstatus获取的子进程退出信息为什么退出码不为1呢这就说明我们对wstatus的认知有问题要根据实际情况来考虑所以wstatus不只有退出码这个wstatus为整型但是实际上是被划分成多个区域可以当成一个位图来看整型为32B其中高16x不考虑低16x中的15x~8x表示退出码后8位中其中6x~0x表示退出信号7x为core dump高位的core dump和终止信号我们现在不谈要到信号才理解core dump占一个比特位低7个比特位表示的是进程退出时的退出信号默认情况下退出情况为程序运行完毕时core dump和终止信号这八个比特位都为0我们案例的情况这个整型的二进制数位100000000转化为十进制数为256那我们要如何获取我们子进程的退出码呢将这个整型变量右移8位在提取前8位数据所以我们对wstatus做操作(wstatus8)0xFF(0xFF为常数有4个字节二进制数前8位为1后面24位为0),先右移在按位与从而获得所以我们bash通过echo $?获取退出码也是用这个格式来转换的(wstatus8)0xFF面对异常我们就不能演示了因为还没有讲到信号但是我们用过一个信号那就第九个信号其实这些信号都是宏定义进程异常终止就在比特位低7为保存异常时对应的信号编号如果没有异常低7位就全为0因为我们发现信号没有0信号所以就认为终止时候没有收到信号一旦低7位比特位!0就代表着异常退出退出码无意义因为程序没有运行完我们来试试获取子进程运行的退出信号通过使用0x7F常量与wstatus来按位与0x7F二进制数为0111 1111所以按位与可以获取前7个比特位数据我们来制造异常来看看情况如何通过让子进程死循环父进程在等待子进程子进程死循环那就是父进程死循所以我们在其他bash端向子进程发出信号kill -9 PID来终止进程此时我们可以看到waitpid获得的退出信息退出信号为9而退出码为0无意义或者是直接让子进程对0地址赋值出现异常子进程接受异常退出父进程接收退出信息对wstatus分析可以获取退出信号为11子问题理解wait、wstatus位操作宏、option理解wait接口进程具有独立性父进程不能直接拿到子进程的退出信息退出码、退出信号通过全局变量来获取没意义写时拷贝后内存重新分配所以需要wait系统调用接口来实现那这些系统调用是从子进程什么地方拿到退出信息的呢我们要了解系统调用在哪里拿的退出信息就要知道退出信息存在哪里子进程退出进程需要进入僵尸状态虚地址空间和页表可以释放掉但是PCB还要保留所以子进程僵尸只剩下PCB退出信息只能存储在PCB内在PCB内可以预测到int exit_code;int exit_signal;这样的整型数据当子进程退出时OS就会把子进程main的返回值保存到子进程PCB退出信号默认为0若有信号就存储进去父进程通过调用waitpid系统调用通过调用这个接口找到子进程PCB找到子进程的退出信息并通过位操作我们是按位与这里就逆操作按位或赋值给父进程的wstatus父进程从而获取子进程的退出信息这就是waitpid系统调用的实现父进程向系统申请获取子进程退出信息系统就向子进程查找退出信息并将退出信息交给父进程这也解释了之前的系统调用getpid()的调用原理了所以这就是需要僵尸进程的原因wstatus位操作的宏我们知道wstatus整型真正的使用方式和位图类似分为多个区域操作退出码和退出信号的区域分别在8x~15x和0x~6x,我们要获得对应的退出信息要自己做位操作但是OS不想让你操作OS内部有想要的位操作方法我们来了解了解WIFEXITED(wstatus): 判断子进程退出信号是否异常如果异常需要输出信号可以使用wstatus0x7F来获取WEXITSTATUS(wstatus)WIFEXITED(wstatus)为非零提取子进程退出码所以WIFEXITED通常用于成功等待后判断子进程是否异常就像上图等待成功信号无异常就输出rid和退出码信号异常就输出信号异常其实对于具体某个异常信号的获取没有移动要求只有专门调试的时候在需要知道optionwaitpid()内部还有一个参数我们没有提及过那就是int option!这个参数可以设置一些选项默认为0时代表默认阻塞等待其他的选项很多都不用了但是我们要来谈谈选项WNOHANGreturn immediately if no child has exited如果子进程没有退出我们就立即返回即非阻塞调用非阻塞调用我们应该是第一次认识WwaitNO:不要HANG夯住当计算机卡死了做任何操作没有反应就可以说这个计算机被夯住了可以说子进程阻塞了,则WNOHANG就是不夯住就是不阻塞用例子来理解要期末考试了小张没有上课舍友小李是学霸有完整的笔记小张就打电话给小李想找小李给他补课小李说没问题但是要等他一会小张就说没问题然后挂了电话每个一会小张等不及了又打电话给小李小李还没有好小张又挂了小张就这也打了多次电话直到小李下来其中打电话是函数调用小李是OS小张是用户小张打电话就是一次调用打一次电话挂了知道小李没结束是非阻塞查了一次状态是没结束小李什么时候结束也不清楚只能打多次电话 这就是非阻塞轮询访问子进程发现未结束就立即函数返回多次查询后面小张发现又有一科课程要考试了也没上又打电话找小李这次小李同样要等一会小张说可以等你然后说我不挂电话了等你出门了我再挂电话这里小张不挂电话等待直到小李把操作做完才挂电话即用户waitpid访问子进程一直等待子进程结束才返回这就是阻塞调用scanfcin轮询是计算机中的术语所以的轮询在计算机中都是通过循环实现的在循环调用waitpid时每次循环都判断waitpid的返回pidpid 0等待结束pid 0调用结束但是子进程没有退出pid 0等待失败我们再回到非阻塞轮询的例子挂电话期间小张也可以做一些自己的事前看看C语言书、刷手机、发呆等等反正小张可以做自己的事情过来一会再向小李打电话非阻塞调用可以让等待方做做自己的事情再通过一个例子来展示非阻塞调用父进程可以周期性的做自己的事情上面这个例子就展示了在非阻塞调度期间父进程做自己的任务周期性的做自己的任务提高了父进程的效率解放生产力而我们在bash调用sleepsleep也是进程我们发现bash调用sleep后不能调用其他命令这是因为bash在阻塞调用sleepbash等待sleep子进程调用完才继续运行

相关新闻

2026年8月GEO洞察检测工具排行榜

2026年8月GEO洞察检测工具排行榜

2026年8月GEO洞察检测工具排行榜 一、为什么"GEO洞察检测"需要一份严肃的排行榜 2026年,Gartner关于"约25%传统搜索行为被AI问答取代"的预测正在应验。当用户开始习惯在豆包、DeepSeek、Kimi、元宝里直接问"哪个品牌好"时&#xff0c…

2026/8/13 20:12:55 阅读更多 →
Java实现电商推荐系统:SpringBoot+协同过滤实战

Java实现电商推荐系统:SpringBoot+协同过滤实战

1. 项目概述:唯品会推荐系统的技术架构与核心价值 作为一名长期从事电商系统开发的工程师,我参与过多个推荐系统的设计与实现。今天要分享的是基于Java技术栈的唯品会风格推荐系统实现方案。这个系统采用了SpringBootSSM的主流框架组合,核心难…

2026/8/12 18:10:22 阅读更多 →
熬夜党自救!亲测这6款AI写作辅助平台,从大纲到终稿全程开挂

熬夜党自救!亲测这6款AI写作辅助平台,从大纲到终稿全程开挂

从开题到降重,AI工具链10分钟搞定文献综述,知网查重率直降!解放双手专注核心论点,这才是学术价值的真正突破。 1.千笔 AI:开题报告 & 文献综述「闪电战专家」实测场景:经济学开题报告从空白到导师通过 …

2026/8/12 18:09:22 阅读更多 →

最新新闻

DisCEdge: Distributed Context Management for Large Language Models at the Edge

DisCEdge: Distributed Context Management for Large Language Models at the Edge

DisCEdge 论文总结与核心部分翻译 一、主要内容总结 本文聚焦于大语言模型(LLM)在边缘节点部署时的上下文管理挑战,提出了分布式上下文管理系统 DisCEdge,核心内容如下: 问题背景:LLM 具有无状态特性,在地理分布式边缘节点部署时,用户上下文(会话历史、偏好等)的一…

2026/8/13 22:26:08 阅读更多 →
2026年神经酸能提升记忆力吗?7款脑营养产品数据实测排行

2026年神经酸能提升记忆力吗?7款脑营养产品数据实测排行

​一、“神经酸对记忆力到底有多大帮助?——一个让我翻了一周文献的问题”“孩子背课文比同学多花一倍时间,我查了说神经酸能改善记忆力,但到底能改善多少?有没有具体的数据或者文献支撑?我不想听“有好处”这种模糊的…

2026/8/13 22:26:08 阅读更多 →
Android非Root环境下跨应用私有数据访问:Content Provider与备份解析实战

Android非Root环境下跨应用私有数据访问:Content Provider与备份解析实战

1. 项目概述&#xff1a;一个看似不可能的任务在Android开发或者逆向分析的过程中&#xff0c;我们常常会遇到一个令人头疼的瓶颈&#xff1a;如何访问其他应用存储在/data/data/<package_name>目录下的私有数据&#xff1f;这个目录是Android沙盒安全模型的核心&#xf…

2026/8/13 22:26:08 阅读更多 →
Java构建智能穿戴健康数据服务:云端API与蓝牙直连混合架构实战

Java构建智能穿戴健康数据服务:云端API与蓝牙直连混合架构实战

1. 项目概述与核心价值 最近在做一个健康管理相关的项目&#xff0c;需要从用户佩戴的智能手环、手表里实时拉取心率、步数、睡眠这些健康数据。一开始觉得这应该是个挺简单的活儿&#xff0c;不就是个蓝牙连接加数据解析嘛。但真上手才发现&#xff0c;从五花八门的设备厂商、…

2026/8/13 22:26:08 阅读更多 →
蝴蝶535 Bugout对比评测:EDC折刀选购指南与竞品分析

蝴蝶535 Bugout对比评测:EDC折刀选购指南与竞品分析

这次我们来看一个关于刀具对比的讨论&#xff0c;标题“后悔了&#xff01;蝴蝶535和它比就是一坨翔&#xff01;”非常直接地指向了刀具爱好者圈内的一场热门对比。核心议题是&#xff1a;Benchmade&#xff08;蝴蝶&#xff09;535 Bugout这款备受争议的轻量化EDC&#xff08…

2026/8/13 22:26:08 阅读更多 →
ViQ: Text-Aligned Visual Quantized Representations at Any Resolution

ViQ: Text-Aligned Visual Quantized Representations at Any Resolution

Vi 论文 ViQ: Text-Aligned Visual Quantized Representations at Any Resolution 完整总结+分段双语翻译 一、论文整体概述与核心创新 (一)论文核心内容总结 本文由腾讯优视团队联合清华、南洋理工、中科院研究者提出ViQ——一款支持原生任意分辨率、文本对齐的离散视觉量…

2026/8/13 22:25:08 阅读更多 →

日新闻

Visual Studio新建项目解决方案为空:系统性排查与修复指南

Visual Studio新建项目解决方案为空:系统性排查与修复指南

1. 问题现象与本质剖析如果你是一位.NET开发者&#xff0c;或者正准备踏入这个领域&#xff0c;那么Visual Studio&#xff08;后面简称VS&#xff09;绝对是你绕不开的伙伴。但有时候&#xff0c;这个伙伴会跟你开一个不大不小的玩笑&#xff1a;你满怀期待地点击“创建新项目…

2026/8/13 0:00:09 阅读更多 →
长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

说实话,每次提起“长春建设厅网站”这几个字,我心里都挺有感触的。不是因为它有多高大上,也不是因为那里藏着什么不可告人的秘密,恰恰相反,是因为它太“接地气”了,或者说,它是咱们普通人想要在这个城市好好生活、安稳买房时,必须得翻过的一座“数据山”。很多新朋友第…

2026/8/13 0:00:09 阅读更多 →
Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南&#xff1a;RDPWrap终极解决方案 【免费下载链接】rdpwrap.ini RDPWrap.ini for RDP Wrapper Library by StasM 项目地址: https://gitcode.com/GitHub_Trending/rd/rdpwrap.ini 你是否曾为Windows家庭版无法支持多用户远程桌面…

2026/8/13 0:00:09 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑&#xff1a;baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码&#xff08;维护中 rm repo&#xff09; 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片&#xff1a;Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/13 10:41:52 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身&#xff0c;而应重视模型外的系统搭建&#xff0c;即Harness。提出AgentModelHarness的实用公式&#xff0c;详细介绍Harness的四个层次&#xff1a;持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速&#xff1a;macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/13 10:41:50 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南&#xff1a;3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗&#xff1f;ncmdump解密工具帮你轻松解决这个困…

2026/8/13 10:41:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片&#xff1a;为英语学习 App 打造桌面级学习助手适用平台&#xff1a;HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0&#xff08;API 26 Beta&#xff09;新增了 AgentCard 智能体卡片能力&#xff0c;这是继 HMAF&#xff08;鸿蒙智能体框架&#x…

2026/8/13 10:41:49 阅读更多 →