当前位置: 首页 > 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.gsyq.cn/news/93718.html

相关文章:

  • 2025年GEO优化机会与争议以及规范发展的必要性
  • 2025最新!大模型学习路线图:超全超详细,从语言模型基础到LLM安全框架! - 详解
  • 压缩空气储能和释能阶段模型,附相关文档文献。 建立了压缩空气储能系统中的压缩机、换热器、储气罐...
  • 17. Qt深入 容器删除元素的异常处理
  • springboot公务员应届生复习备考平台_tm7d928l
  • C51_红外通信
  • JConsole 中 GC 时间统计的含义
  • LightModel
  • 说说ESim电工仿真软件
  • ModelEngine实战指南:从零开始构建智能对话应用
  • Profiling 专项
  • 旧物改造灵感库,核心功能,分享旧物改造案例,如塑料瓶做花盆,旧衣服改围裙等,支持搜索改造类型,上传自己的作品,应用场景,喜欢动手的中老年人找改造灵感,废物利用省钱又环保。
  • 如何全面评估大语言模型:从测试基准到性能优化的完整指南
  • 如何完成一个方便简单的Arduino共阳极数码管实验(从0~9依次循环亮起)
  • 基于php的幸运舞蹈工作室管理系统设计与实现(源码+lw+部署文档+讲解等)
  • 10分钟搞定HunyuanVideo部署:从零开始生成你的第一个AI视频
  • 基于php的微信小程序的学习交流平台系统(源码+lw+部署文档+讲解等)
  • springboot共享自习室管理系统_2bm6j0gn-
  • 柠檬 软件测试之python全栈自动化测试工程师第25期
  • 基于Python的毕业生去向反馈调查平台的设计与实现(源码+lw+部署文档+讲解等)
  • System Informer:你的Windows系统管家,3大核心功能深度解析
  • 车载功能测试都要做什么?总结来了~
  • Optic开源项目:API管理与测试的终极解决方案
  • 如何快速解锁RouterOS无限权限:MikroTikPatch的终极指南
  • 快速获取Notion安卓版:2024最新下载安装全攻略
  • 终极Go接口模拟测试:用mockery重新定义高效测试策略
  • 嵌入式软件开发,测试、找bug技巧
  • 云南民宿联盟:破解诗与远方的生存密码
  • CppSharp项目详解:C/C++到.NET的自动化绑定工具指南
  • Cerebro插件开发终极指南:从入门到精通的完整教程