news 2026/7/1 8:54:37

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/7/1 18:16:28

CAN通讯协议

一、CAN物理层1、电气特性总线结构物理特征(左:闭环;右:开环):​CAN总线由两根信号线组成,使用的是差分信号,是一种异步通讯CAN总线网络的结构有闭环和开环两种,其对应标…

作者头像 李华
网站建设 2026/6/30 21:29:49

家庭园艺种植提醒工具,核心功能,录入植物名称,比如绿萝,月季等,种植日期,设置浇水周期,施肥周期,到点自动弹出提醒,记录养护日志,应用场景,养花爱好者,尤其是记性不好的老年人,让植物养得更茂盛。

家庭园艺种植提醒工具下面是一个完整的家庭园艺种植提醒工具&#xff0c;专为养花爱好者特别是记忆力不佳的老年人设计。这个工具可以帮助用户记录植物信息、设置养护周期、接收提醒并记录养护日志。<!DOCTYPE html> <html lang"zh-CN"> <head><…

作者头像 李华
网站建设 2026/6/30 21:46:12

5大优势解析:为什么art-design-pro成为现代后台管理的首选方案

在现代软件开发中&#xff0c;一个优秀的后台管理系统往往决定着整个项目的成败。art-design-pro作为一款基于Vue3、TypeScript、Vite和Element-Plus精心打造的后台管理解决方案&#xff0c;凭借其出色的用户体验和视觉设计&#xff0c;正在成为开发者们的首选工具。 【免费下载…

作者头像 李华
网站建设 2026/6/30 13:54:11

初创公司缺法务、缺设计、缺运营,如何靠AI提高工作效率?

据哈佛商学院与CB Insights联合研究&#xff0c;超过70%的初创企业在前五年内失败&#xff0c;其中“团队能力短板”和“现金流压力”长期位列主要原因。更具体地说&#xff1a;创始人往往擅长产品或技术&#xff0c;却缺乏法务合规意识&#xff1b;市场节奏快&#xff0c;但没…

作者头像 李华