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

父子进程关系与终止机制详解

父子进程关系与终止机制

父子进程关系子进程通过fork()系统调用创建,是父进程的副本。现代Linux内核(如Ubuntu 18的Linux 5.4)采用写时复制(Copy-On-Write, COW)技术:子进程初始共享父进程的内存空间,仅当任一进程尝试修改共享数据时,内核才会为子进程分配独立的内存副本。这优化了性能,避免了不必要的内存复制。

进程终止的8种情况

  • 正常终止:
    • main()函数中执行return语句。
    • 调用C库函数exit(),会清理I/O缓冲区、关闭文件流、执行atexit()注册的函数。
    • 调用系统调用_exit(),直接终止进程但不清理缓冲区或执行atexit()函数。
    • 主线程退出或调用pthread_exit()
  • 异常终止:
    • 调用abort()触发SIGABRT信号。
    • 通过信号(如kill命令发送SIGKILL)终止进程。
    • 最后一个线程被pthread_cancel()取消。

僵尸进程与孤儿进程

僵尸进程
子进程终止后,其PCB(进程控制块)未被父进程回收(通过wait()waitpid()),导致内核资源泄漏。长期运行的父进程若频繁创建短生命周期子进程,可能导致系统资源耗尽。

孤儿进程
父进程先于子进程终止时,子进程被init进程(PID 1)接管,由init负责后续回收,无需额外处理。

进程退出函数对比

exit()_exit()

  • exit(int status)
    • 库函数,终止进程并执行清理(刷新缓冲区、调用atexit()注册的函数)。
    • 参数status传递退出状态(EXIT_SUCCESSEXIT_FAILURE)。
  • _exit(int status)
    • 系统调用,立即终止进程,不执行任何清理。
    • 适用于需要快速退出的场景(如子进程异常处理)。

执行顺序
exit()→ 刷新缓冲区 → 执行atexit()注册函数 → 调用_exit()

进程资源回收

wait()函数

pid_t wait(int *status);
  • 阻塞等待任意子进程退出,并回收其资源。
  • status参数存储子进程退出状态,可通过宏解析:
    • WIFEXITED(status):判断是否正常退出。
    • WEXITSTATUS(status):获取正常退出的返回值。
    • WIFSIGNALED(status):判断是否因信号终止。
    • WTERMSIG(status):获取终止信号的编号。

示例代码

int status; pid_t pid = wait(&status); if (WIFEXITED(status)) { printf("Child exited with status %d\n", WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { printf("Child killed by signal %d\n", WTERMSIG(status)); }

关键注意事项

  • 长期运行的父进程必须主动回收子进程,避免僵尸进程累积。
  • exit()_exit()的选择需根据清理需求决定。
  • 信号处理中若需立即终止进程,优先使用_exit()以避免缓冲区操作未完成的问题。
http://www.jsqmd.com/news/88798/

相关文章:

  • 2025年起名改名机构推荐:权威榜TOP5机构深度解析 - 十大品牌推荐
  • 2025年生辰八字起名机构推荐:权威榜TOP5机构深度解析 - 十大品牌推荐
  • Product Hunt 每日热榜 | 2025-12-14
  • 2025年生辰八字起名机构推荐:权威TOP5机构深度解析 - 十大品牌推荐
  • SpringCould —— 网关详解
  • 实验实验实验
  • WinForm DataGridView:单元格类型与高频绘制案例
  • 2025年生辰八字起名机构推荐:榜TOP5机构深度解析 - 十大品牌推荐
  • 2025年八字起名机构推荐:权威榜TOP5机构深度解析 - 十大品牌推荐
  • 基于改进YOLO13-C3k2-WDBB的石棉类型识别与检测系统详解
  • 2025年八字起名机构推荐:权威榜单TOP10机构深度解析 - 十大品牌推荐
  • 存储引擎内核:深入解析 LSM-Tree 原理与高吞吐写入实践
  • 告别逐张修图!AI批量换模特图背景,新手也能统一风格
  • 30、进程间通信:文件锁、共享内存与信号机制
  • 用带头节点的链式存储实现栈的操作
  • Claude vs ChatGPT vs Gemini:全方位对比与选用指南
  • 2025年女孩起名机构推荐:权威起名机构榜TOP5深度解析 - 十大品牌推荐
  • 31、进程间通信:信号、管道与套接字详解
  • 第二十九周 学习周报
  • 在 IntelliJ IDEA 中高效使用 Git 的实用指南
  • 2025年女孩起名机构推荐:权威起名机构榜单深度解析与选择指南 - 十大品牌推荐
  • LeetCode 2147.分隔长廊的方案数:非Hard组合数学
  • nacos集群部署
  • 2025年起名专家推荐:权威榜单TOP5深度解析与选择指南 - 十大品牌推荐
  • java计算机毕业设计社区志愿者服务系统 智慧社区公益志愿协同平台 基层志愿者数字化运营管理系统
  • 物联网通信之CAN通讯
  • 2025年女孩起名机构推荐:权威榜单TOP5机构深度解析 - 十大品牌推荐
  • Highcharts 扩展开发 文档说明
  • 2025年起名专家推荐:权威榜单TOP5服务深度解析 - 十大品牌推荐
  • 保姆级教程:iPhone 某人短信消失?9 种解决方法,小白也会用