【知识讲解】 Linux进程认识及深度理解

发布时间:2026/9/8 15:22:28
【知识讲解】 Linux进程认识及深度理解 目录前言Part1. fork失败的两个原因Part2. 进程退出Part2.1. 进程退出的场景Part2.2. return底层原理Part2.3. 获取退出码Part2.4. 僵尸进程Part3. 进程等待 wait、waitpidPart3.1. wait函数2. waitpid函数Part4. status状态位图、解析宏Part5. 进程程序替换、exec系列函数Part5.1. 程序替换介绍Part5.2. exec系列函数Part6. 整体总结Part7. 结语前言Linux系统中执行任务的基本是进程对于他的理解是非常重要的接下来来跟随小编的视角来看看吧。lets go!!!!!!!!Part1. fork失败的两个原因1. 系统内进程数量达到上限无法创建新进程。2.内存资源不足子进程需要复制页表、虚拟地址空间内存不够时fork失败。shell小知识点bash内置命令cd、echo、export不会创建子进程直接在当前bash进程执行外部命令ls、cat会fork创建子进程在子进程中执行程序。Part2. 进程退出Part2.1. 进程退出的场景进程退出意味着释放占用内存、回收各类内核资源。三种退出场景1.正常退出代码执行完毕。◦ main函数return◦ 调用库函数exit()◦ 系统调用_exit()。2.异常退出1收到信号程序崩溃段错误、kill杀死进程。3.异常退出2代码逻辑出错执行异常。main的返回值代表进程执行状态• 返回0程序执行成功• 返回非0程序执行出错。Part2.2. return底层原理• 返回值数值比较小把返回值放到寄存器直接给内核• 返回值数值大走内存拷贝把返回值传递给内核。Part2.3. 获取退出码1. shell中echo $?查看上一个进程的退出码。2. 程序内◦strerror(x)传入错误码返回对应错误描述字符串头文件string.h。◦errno系统调用失败时会设置全局错误码头文件errno.h。注意如果进程是被信号杀死崩溃返回的数字不是普通return退出码代表收到的信号编号。Part2.4. 僵尸进程子进程退出之后内核不会立刻释放子进程的task_struct。• 子进程的退出状态、退出码保存在task_struct• 必须等待父进程调用wait / waitpid读取这个退出信息• 如果父进程一直不回收子进程就变成僵尸进程。僵尸进程本身不占用内存但是task_struct内核结构体残留大量僵尸会占用pid资源导致无法新建进程。Part3. 进程等待 wait、waitpid为什么需要进程等待1.回收子进程资源避免产生僵尸进程。2.获取子进程退出信息判断子进程是正常跑完还是异常崩溃。Part3.1. wait函数#include sys/wait.h pid_t wait(int *status);• 功能阻塞等待任意一个子进程退出。• 返回值0成功返回退出的子进程pid-1调用失败没有子进程。• 参数status输出型参数把子进程退出状态带回父进程。传NULL代表不关心退出状态。缺点wait是阻塞调用如果子进程没有退出父进程就卡住不能做别的工作只能等待任意子进程无法指定某一个子进程。2. waitpid函数#include sys/wait.h pid_t waitpid(pid_t pid, int *status, int options);参数解析1.pid_t pid指定要等待哪个子进程◦pid 0等待pid等于该值的指定子进程◦pid -1等待任意一个子进程等价于wait◦pid 0等待和调用者同组的所有子进程◦pid -1等待该进程组内任意子进程。2.*int status输出参数保存子进程退出信息。status不是简单的退出码是一个位图需要宏函数解析。3.int options选项最常用WNOHANG。◦WNOHANG非阻塞等待。如果子进程还没有退出waitpid立刻返回0父进程不会卡住可以继续做其他业务轮询检测子进程状态。waitpid返回值• 0有子进程退出返回退出子进程pid• 0设置WNOHANG子进程还没有退出•-1出错没有子进程。Part4. status状态位图、解析宏status是int内核把多种退出信息打包到这个整数不能直接打印status当做退出码要用系统提供的宏解析。核心宏1.WIFEXITED(status)判断进程是否正常退出return / exit。返回true代表正常结束。2.WEXITSTATUS(status)如果WIFEXITED为true用它拿到子进程的退出码等价main return的值。3.WIFSIGNALED(status)判断进程是否被信号杀死异常崩溃返回true代表死于信号。4.WTERMSIG(status)如果WIFSIGNALED为true获取杀死进程的信号编号。位图底层原理int共32bit低7bit用来保存终止信号次8bit保存进程退出码。取出退出码(status 8) 0xFF。取出信号编号status 0x7F。非阻塞轮询示例代码模板pid_t id waitpid(pid, status, WNOHANG); if(id 0) { //子进程退出处理回收逻辑 } else if(id 0) { //子进程还没退出父进程做自己的业务过一会再来waitpid } else { //出错 }wait底层原理子进程退出内核释放绝大部分资源task_struct保留父进程调用wait/waitpid内核把保存在task_struct里面的退出状态拷贝给父进程之后彻底释放task_struct。Part5. 进程程序替换、exec系列函数Part5.1. 程序替换介绍fork创建子进程之后子进程默认复制父进程的代码和数据。很多场景我们希望子进程跑完全不同的程序就使用exec族函数做程序替换。注意程序替换不会创建新进程pid不变虚拟地址空间不变task_struct不变仅仅把磁盘上新程序的代码段、数据段加载到当前进程的虚拟地址空间覆盖原来的代码数据。堆、栈会重新初始化。Part5.2. exec系列函数#include unistd.h //示例执行ls -l -a execl(/usr/bin/ls, ls, -l, -a, NULL);函数名后缀含义•llist可变参数列表传参以NULL结尾•ppath自动从环境变量PATH寻找可执行文件不用写完整路径•vvector参数放到字符串数组传入•eenvironment可以自己传入自定义环境变量。常用函数execl、execlp、execv、execvp、execve系统调用其他都是库函数封装。exec函数返回值exec调用成功没有返回值直接跳转到新程序入口运行只有调用失败才返回-1继续执行原来代码。经典模型1. fork创建子进程2. 子进程调用exec做程序替换跑新业务3. 父进程调用wait/waitpid等待子进程回收资源。Part6. 整体总结1.fork失败两大原因系统进程数上限、内存不足。shell内置命令不创建子进程。2.进程退出正常退出return/exit、信号异常崩溃。退出码保存在内核task_struct。3.僵尸进程子进程退出父进程没有wait回收残留task_struct。4.wait阻塞等待任意子进程waitpid可以指定子进程支持WNOHANG非阻塞轮询。status位图通过WIFEXITED、WEXITSTATUS解析退出信息。5.exec程序替换不产生新进程覆盖当前进程代码数据forkexec是Linux创建执行业务进程的标准范式。Part7. 结语这篇文章我们认识并知道了Linux进程接下来小编还会带来更多Linux相关的知识敬请期待~最后祝大家可以春风得意马蹄疾一日看尽长安花最后的最后要是觉得本文还可以的话可以点点赞关注小编一波谢谢大家~

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询