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

Linux系统编程——进程进阶:父子关系、终止与资源回收

目录

一、父子进程关系

二、进程终止的 8 种场景

三、退出函数

1.exit()

1)基础信息

2)核心特点

3)参数 status 的作用

4)exit 与 return 的区别

2._exit()

1)基础信息

2)核心特点

四、退出后的进程状态

1.僵尸进程(Zombie)

2.孤儿进程(Orphan)

五、进程空间的回收


一、父子进程关系

  • 子进程是父进程的内存副本(包含代码、数据、PCB 等资源);
  • 写时复制(Linux 2.6+):fork 后父子进程共享内存空间,仅当某一方修改内存区域时,才会开辟独立空间 —— 减少冗余内存开销。

二、进程终止的 8 种场景

正常终止

  1. main 函数中 return:进程随 main 函数结束而退出;
  2. exit():C 库函数,会先刷新缓存、调用 atexit 注册的清理函数,再关闭文件描述符;
  3. _exit/_Exit:系统调用,直接关闭打开的文件,但不刷新缓存、不执行清理函数;
  4. 主线程退出:整个进程会随主线程结束而终止;
  5. 主线程调用 pthread_exit:仅主线程退出,进程是否终止取决于是否有其他线程在运行。

异常终止

  1. abort():主动触发异常终止(比如程序崩溃时会调用);
  2. 信号终止:比如用 kill pid 给进程发终止信号;
  3. 最后一个线程被 pthread_cancel 取消:线程被取消后,进程随之终止。

三、退出函数

函数类型缓存处理执行流程
exit()C 库函数刷新缓存刷新缓存 → 执行 atexit 清理函数 → 调用 _exit()
_exit()系统调用不刷新缓存直接终止进程、释放资源

1.exit()

1)基础信息

  • 类型:C 标准库函数
  • 函数原型:void exit(int status)
  • 示例调用:exit(1);

2)核心特点

  • 功能:让进程退出,并刷新缓存区
  • 参数:status(进程退出的状态)
  • 返回值:缺省

3)参数 status 的作用

status 用于表示进程的退出状态:

  • 正常终止时,状态由 exit 传入的 status 指定;
  • 异常终止时,状态由内核提供(包含异常原因);
  • 父进程可通过 wait/waitpid 获取该状态,完成资源回收。

常用预定义状态宏:

宏名含义
EXIT_SUCCESS0进程正常退出
EXIT_FAILURE1进程异常退出

4)exit 与 return 的区别

  • 若 return 出现在 main 函数中:会触发整个进程终止;
  • 若 return 出现在其他函数中:仅终止当前函数,不影响进程运行。

注:main 中的 return 等价于 exit(return值),其他函数中 return 仅结束当前函数。

exit 是进程正常终止的常用方式之一,其优势在于能保证 I/O 缓存区的数据被正确刷写到目标文件,避免数据丢失(这是它与直接调用系统调用 _exit 的核心差异)。

2._exit()

1)基础信息

  • 类型:Linux 系统调用(直接与内核交互,非库函数封装)
  • 函数原型:void _exit(int status);

2)核心特点

  • 功能:直接终止当前进程,但不刷新 I/O 缓存区—— 进程中暂存于 I/O 缓存的未写入数据会被直接丢弃,无法保存到目标文件。
  • 参数status:用于表示进程退出状态,与 exit 的 status 作用一致,父进程可通过 wait/waitpid 获取该状态,完成子进程的资源回收。
  • 返回值:无(进程终止后无返回逻辑)

四、退出后的进程状态

进程退出后,不是所有资源都会立刻清理 —— 这就产生了两种特殊进程:

1.僵尸进程(Zombie)

  • 场景:父进程创建子进程后,子进程先退出,但父进程没回收子进程的内核数据结构(PCB);
  • 特点:用户空间内存已释放,但内核里的 PCB 还在,进程状态显示为 Z(zombie);
  • 危害:如果父进程长期运行且频繁创建子进程,僵尸进程会占满内核内存,导致系统不稳定。

可以使用 top 或 ps 指令查看:

2.孤儿进程(Orphan)

  • 场景:父进程先退出,子进程失去父进程;
  • 特点:子进程会被 init(或systemd)进程收养,后续由新父进程负责回收资源;
  • 结论:无需额外关注,系统会自动处理。

五、进程空间的回收

要解决僵尸进程问题,父进程得主动调用 wait 函数回收子进程:

pid_t wait(int *status);
  • 功能:父进程阻塞等待任意子进程退出,并回收其 PCB;
  • 参数 status:存储子进程的退出状态(不想关注可以传 NULL);
  • 返回值:成功返回被回收的子进程 PID,失败返回 - 1。

可以用这些宏解析 status 里的信息:

  • WIFEXITED(status):判断子进程是否正常终止;
  • WEXITSTATUS(status):获取子进程正常终止时的退出码;
  • WIFSIGNALED(status):判断子进程是否被信号终止;
  • WTERMSIG(status):获取终止子进程的信号编号。
http://www.jsqmd.com/news/83524/

相关文章:

  • 微信美业医疗美容院小程序预约会员管理养生馆诊所肌护肤理疗系统
  • behavior interview II
  • 2025年GEO优化机会与争议以及规范发展的必要性
  • 2025最新!大模型学习路线图:超全超详细,从语言模型基础到LLM安全框架! - 详解
  • 聊聊饮料生产罐装生产线的S7 - 1200 PLC开发
  • COMSOL泰勒锥模型:水平集耦合空间电荷密度
  • Spring 开发小白学习过程中常用通用配置文件,即拿即用!(持续更新中)
  • 压缩空气储能和释能阶段模型,附相关文档文献。 建立了压缩空气储能系统中的压缩机、换热器、储气罐...
  • 16. Qt深入 容器
  • 400亿美元骗局落幕,LUNA加密货币创始人被判15年!
  • 2026老年春晚怀化区域节目征集启动仪式在怀化学院举行
  • soular实战教程系列(1) - 安装与配备
  • 17. Qt深入 容器删除元素的异常处理
  • 251213一天不能就这样过去
  • 评估AI系统时如何减少标注工作
  • 香港就加密货币税收规则启动公众咨询
  • 为什么你的视觉AI项目总是耗时又低效?Florence-2-large-ft一站式解决方案
  • springboot公务员应届生复习备考平台_tm7d928l
  • C51_红外通信
  • Flutter 2025 安全加固指南:从代码混淆到数据加密,构建可信、合规、防逆向的移动应用安全体系
  • 5大优势解析:为什么art-design-pro成为现代后台管理的首选方案
  • 菜市场价格对比工具,输入蔬菜/肉类名称,显示周边三个菜市场的实时价格及距离,推荐性价比最高的购买地点。
  • 基于Dify/n8n/Coze的实时交友聊天系统解决方案V3
  • Flutter 2025 自动化测试全栈指南:从单元测试到 E2E,构建坚如磐石的高质量交付体系
  • Profiling 专项
  • 旧物改造灵感库,核心功能,分享旧物改造案例,如塑料瓶做花盆,旧衣服改围裙等,支持搜索改造类型,上传自己的作品,应用场景,喜欢动手的中老年人找改造灵感,废物利用省钱又环保。
  • 如何全面评估大语言模型:从测试基准到性能优化的完整指南
  • springboot公司人力资源管理系统_nvj0q68d-
  • Go 语言
  • 儿童护眼灯什么牌子的好?黑马顶流护眼灯揭秘,宝妈圈都在夸!