恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

14_Linux学习总结_进程等待

  • 首页
  • 资讯中心
  • /
  • 14_Linux学习总结_进程等待

相关资讯

创成式AI深度解析:原理、应用场景与工程实践避坑指南 2026/10/12 3:58:57
DeepSeek_Harness_桌面版安装教程(超级详细) 2026/10/12 3:58:57
RAG评估系统构建指南:可量化的检索与生成质量指标 2026/10/12 3:58:57

最新资讯

Python aigc-intent-solt 包实战案例与常见错误
毕业论文答辩PPT模板实操指南:结构拆解与替换避坑
变频器干扰工控机重启?EMC治理接地布线滤波隔离全解析
Oracle性能调优实战:SGA内存参数与SQL语句优化指南
汇编语言期末试题调试实战:从PDF到可执行的完整链路
PostgreSQL性能压测实战:用TPC-H标准流程构建可复现基准测试环境

今日推荐

Debian新手入门:从部署到日常操作的完整指南
MongoDB复制集扩缩容实战:从rs.add到选主事故复盘
条形码目标检测数据集实战:从YOLOv8训练到部署

本周热门

UE动画修改实战:从资产编辑到重定向与蒙太奇驱动
统计随机数生成器攻击下的KLJN安全密钥交换协议Matlab仿真
政务API安全治理:资产测绘、低代码编排与行标对标实践

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

14_Linux学习总结_进程等待

发布时间:2026/10/12 4:03:57
14_Linux学习总结_进程等待 子进程退出时内核会保留其退出状态等相关信息以便父进程可以获取因此子进程会先进入僵尸状态。如果父进程一直没有回收子进程的残留信息子进程的 PCB 就会一直驻留在内存中造成资源泄漏。想要释放这部分资源就需要父进程通过进程等待来实现。父进程通过进程等待可以完成两件事回收子进程的资源和获取子进程的信息。进程等待的核心是回收资源这是必须执行的操作目的是清除僵尸进程、释放 PCB 和 PID避免资源泄漏。获取子进程信息是附加功能父进程可根据自身需求选择是否读取不影响资源回收的核心目标。结论哪怕父进程不需要子进程的任何信息也必须调用 wait()/waitpid()这是保证系统稳定的基本要求。上面提到了wait()和waitpid()先来了解wait()wait()是等待任意一个退出的子进程。wait() 是回收僵尸进程的核心手段调用后必然会完成一次回收要么立即要么阻塞等待核心逻辑wait() 以 “阻塞” 为代价确保父进程能可靠回收僵尸子进程不会遗漏关键细节一次 wait() 仅回收一个僵尸进程多僵尸需循环调用。它的参数是一个输出型参数把子进程的相关信息通过一个整形指针放入到该整形指针指向的变量。当wait成功回收子进程时返回的是这个子进程的pid失败是返回-1。当父进程调用wait()时能够回收僵尸进程。父进程需要获得子进程退出时的相关信息就可以选择给该函数传递参数。不需要获得时就传NULL。下面用代码来演示这里只演示父进程回收僵尸进程。不演示父进程获取子进程退出时的信息。所以给该函数传入NULL。上面的代码子进程会每1秒进行打印打印5次之后子进程退出父进程则是一直没有进行回收子进程。我们可以观察到的内容就是前5秒子进程是正常运行。子进程要退出时子进程会先编程僵尸进程此时处于僵尸状态。上面的代码当创建子进程时进程就开始分流。子进程会执行上面 if 语句里面的内容父进程执行图中25行及后面的内容。当父进程执行到wait时父进程就会被阻塞什么也不能做直到子进程退出。因为父进程调用了 wait () 主动等待并回收子进程所以子进程退出后会被立即清理不会进入僵尸状态Z 状态因此无法通过 ps 查看到僵尸进程。所以这里当父进程成功打印时就代表着回收成功。并且成功回收子进程的资源所以rid的值为子进程的pid现在来讲waitpid()当waitpid()的第一个参数为-1第三个参数为0时。等价wait()现在来讲 waitpid 中的第二个参数在上一篇文章中讲过了进程终止时会返回一个退出码。父进程就可以通过 waitpid 函数的第二个参数来获得子进程的退出码和其它的信息。运行上面的代码来看运行成功时status的值时多少可以发现这里status的值为256.上面说过父进程就可以通过 status 获得子进程的退出码和其它的信息但是我们子进程的退出码是1status的值是256。两者看起来没有关系。接下来就告诉大家status该如何看。首先status是一个整形变量在内存中就占4个字节也就是32个bit位。我们可以把这32位分成2个部分。16到31位我们先不考虑默认为0.0到15位可以再划分为2个部分这里的8到15为就是子进程的退出码。0到7位可以再划分2个部分第7为是core dump标志位默认为0.0到6为是终止信号在上一篇文章中我们说过进程退出有三种场景当进程退出为1和2这两种情况时终止信号都为0我们上面的代码都是正常运行。所以这里的终止信号就是0最终就可以得到status想要获得子进程的退出码只需要先让status右移8位再按位与上0xFF就可以获得退出码。运行程序并观察最终结果试着把子进程的退出码修改位20然后再运行程序观察结果。结果如下成功的获得到了子进程的退出码。在上面我们说过status中的0到6位是终止信号。当终止信号位0时代表着1、2两种情况。当代码异常终止时就会出现非0信号。我们先使用kill -l来查看所有信号。之前我们用过kill -9 进程的pid来强制杀死进程过。这里的kill -9就是用9号信号量来杀死进程。我们直到终止信号是0到6位想要获取终止信号的值就只需要status0x7F即可运行程序结果如下再举几个例子例子1此时子进程会一直循环下去。用kill -9 进程pid杀死子进程这里就显示了子进程发生了异常被信号量9给杀死。例子2运行结果例子3运行结果这里做个小总结终止信号为 0 → 进程正常退出代码完整运行完毕无外部信号终止1、退出码为 0 → 代码运行完毕结果正确2、退出码非 0 → 代码运行完毕结果不正确如逻辑错误、参数错误等。终止信号非 0 → 进程异常终止被外部信号强制杀死代码未完整运行此时退出码无意义核心关注终止信号编号如 9SIGKILL、11SIGSEGV排查异常原因现在有一个宏WEXITSTATUS()可以把status传入这个宏中可以获取进程的退出码。可以代替我们上面的位操作。运行结果现在还有一个宏WIFEXITED()把status传入这个宏中WIFEXITED(status)这个表达式为真时非0就代表着子进程正常退出。为假时为0就代表子进程异常退出。运行结果修改一下代码让代码出现异常。运行结果这里要做个区别WIFEXITED(status)和status0x7F前者不能获得终止信号只是用来判断进程是否出现异常。后者能够获得终止信号。现在来讲waitpid中的最后一个参数。前面的等待都是阻塞等待。当options为WNOHANG时那么就是非阻塞等待。先解释HANG当使用计算机时计算机突然卡死一点反应都没有。我们称这个计算机被夯(HANG)住了也就是卡死了。W 等待NO 不要HANG夯WNOHANG非阻塞等待前面使用waitpid的时候都是阻塞等待。也就是父进程执行到waitpid时就必须停下来。什么也不能做被阻塞可以理解为“卡死”。当options为WNOHANG时就是非阻塞等待。父进程执行到waitpid时可以一边等待一边去执行自己剩下的内容。举个例子一、阻塞等待默认 options0生活场景老明点了外卖在送达前必须站在门口一动不动等 —— 不能玩手机、不能炒菜、不能做任何事只能傻等直到外卖员敲门子进程退出才能继续做其他事。二、非阻塞等待optionsWNOHANG生活场景老明点了外卖但正在炒菜父进程有自己的任务要处理不能一直等1、先到门口看一眼执行 waitpid发现外卖没到子进程没退出2、立刻回屋继续炒菜父进程执行自己的代码3、过 1 分钟再到门口看一眼再次执行 waitpid循环往复4、直到某次检查发现外卖到了子进程退出才停止循环处理外卖回收子进程资源。这个 “每隔一会儿检查一次” 的循环就是非阻塞轮询。当waitpid为非阻塞调用时waitpid的返回值就有了变化返回值大于0时代表等待结束子进程退出返回值小于0时代表等待失败返回值等于0时代表此次调用结束但是子进程还没有退出也就是老明去门口检查发现外卖没到易错提醒返回值 0 不是失败只是 “当前没可回收的子进程”这是区分阻塞 / 非阻塞的核心特征把waitpid为阻塞调用时的返回值写出来给大家对比返回值大于0时代表等待结束子进程退出返回值小于0时代表等待失败上面在说非阻塞调用时提到了非阻塞轮询。也就是老明不断循环的过程。所以我们就需要用一个循环来包含waitpid来实现多次调用下面写一个代码给大家展示一下运行程序可以发现父进程在等待过程中还可以做其它的事这就是非阻塞等待。最后把子进程杀掉

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号