news 2026/4/23 13:37:07

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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):获取终止子进程的信号编号。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 12:12:49

旧物改造灵感库,核心功能,分享旧物改造案例,如塑料瓶做花盆,旧衣服改围裙等,支持搜索改造类型,上传自己的作品,应用场景,喜欢动手的中老年人找改造灵感,废物利用省钱又环保。

旧物改造灵感库 - 创新设计梦工场我将设计一个适合中老年人使用的旧物改造灵感库,具有大字体、简洁界面和直观操作流程。设计思路- 采用温暖环保的绿色为主色调- 大按钮和清晰导航方便操作- 卡片式布局展示改造案例- 支持搜索、筛选和上传功能- 响应式设计适配不同设…

作者头像 李华
网站建设 2026/4/23 12:10:20

springboot二手车交易管理系统的设计与实现_e732y0jh-

目录已开发项目效果实现截图开发技术系统开发工具:核心代码参考示例1.建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式&…

作者头像 李华
网站建设 2026/4/23 13:25:59

基于php的智慧农业信息交流论坛系统(源码+lw+部署文档+讲解等)

课题介绍本课题聚焦智慧农业发展背景下农户、农技人员的信息交流需求,设计实现一套基于PHP技术的智慧农业信息交流论坛系统。当前农业领域存在技术信息分散、产销对接不畅、农户交流渠道有限等问题,制约农业现代化发展。系统采用“PHP(Larave…

作者头像 李华
网站建设 2026/4/23 13:35:58

Tasmota设备高效节能配置指南:从入门到精通的完整方案

Tasmota设备高效节能配置指南:从入门到精通的完整方案 【免费下载链接】Tasmota arendst/Tasmota: Tasmota 是一款为 ESP8266 和 ESP32 等微控制器设计的开源固件,能够将廉价的WiFi模块转换为智能设备,支持MQTT和其他通信协议,广泛…

作者头像 李华