news 2026/8/27 8:36:10

Linux软件编程(4)进程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux软件编程(4)进程

最近学了Linux软件编程中进程的部分相关内容,进程和线程这一部分定义比较多,有的比较难以理解,建议搞懂、多背定义。

一、程序和进程

很多人会把程序和进程弄混,其实两者很好区分。
程序,是存放在磁盘上的代码文件,属于静态的,放在那里不会自己运行。
进程,是程序跑起来之后的动态过程,包含创建、调度、消亡完整生命周期。程序运行,就生成进程。

每个进程都有自己独一无二的标识 PID;PPID代表它父进程的ID,用来描述进程之间的父子关系。

二、进程常用命令

写代码之前,先要学会在终端观察进程。

  1. top:实时查看CPU占用,看进程运行状态
  2. ps -ef:查看全部进程,能看到PID、PPID
  3. pstree:以树状打印,直观看到父子进程关系
  4. ps -aux:查看进程详细运行状态

杀死进程:
kill -9 进程PID
killall -9 进程名
后台运行程序:在命令末尾加上&
./a.out &
jobs:查看当前终端下后台任务
fg 编号:把后台任务切回前台运行

修改进程优先级
nice -n 优先级 程序
renice -n 优先级 进程PID

三、进程虚拟内存空间

32位系统每个进程拥有0‑4G虚拟内存空间,分成几个段:

  1. 文本段:存放我们写的指令代码
  2. 数据段:字符串常量、全局变量、静态变量。分为初始化和未初始化两部分
  3. 系统数据段:堆、栈。堆用于动态内存malloc;栈保存局部变量、函数调用。
    关键点:每个进程拥有独立虚拟地址空间。但是全部进程共享0‑4G虚拟内存,由操作系统做分时复用。两个进程看着地址一样,实际对应的物理内存不是同一块。

四、进程调度与进程状态

系统同时跑很多进程,依靠调度算法分配CPU时间。
常见调度算法:先来先执行、高优先级调度、时间片轮转、多级队列反馈、负载均衡。

时间片:CPU分配给单个进程一小段执行时间。宏观上多个程序同时运行,微观上CPU交替执行,同一时刻CPU只跑一个任务。

进程的7种状态

  1. 就绪态R:任务已经准备好了,等待分配CPU
  2. 运行态R:正在CPU上面执行
  3. 可唤醒等待态S:缺资源主动挂起,收到信号可以被唤醒
  4. 不可唤醒等待态D:等待过程不能被信号唤醒
  5. 停止态T:进程被暂停
  6. 僵尸态Z:代码已经执行完毕,但是资源没有被父进程回收
  7. 结束态X:资源已经回收,进程彻底消失

五、进程编程核心函数

  1. fork()
    pid_t fork(void);
    功能:创建子进程。
    返回值规则一定要记牢:

父进程:返回新创建子进程的PID(大于0)
子进程:返回0
创建失败:返回‑1

调用fork之后,会复制一份父进程地址空间,父子两个进程,从fork之后的代码分别往下执行。
注意:子进程不会从头重新执行main,从fork返回处继续运行。
如果子进程不写return/exit退出,子进程还会继续执行后面的代码,甚至继续fork,生成大量多余子进程。

  1. getpid() / getppid()

getpid() 获取当前自己进程PID
getppid() 获取父进程PID

  1. exit()
    void exit(int status);
    结束当前进程。
    main函数里面exit()和return效果基本一致;普通函数内部return只是函数返回,不会结束进程,想要结束进程必须调用exit。

ps、僵尸进程怎么产生,如何避免?
产生原因:子进程代码执行结束,但是父进程没有回收子进程资源。子进程就变成僵尸进程Z,PID还占着,内存没有释放。

解决办法:

  1. 父进程先退出,子进程变成孤儿进程,会被系统init进程收养,由init帮忙回收。
  2. 父进程调用wait(),主动回收子进程,这是我们写代码最常用的方式。

七、wait函数
pid_t wait(int *wstatus);
功能:回收子进程资源,具备阻塞特性。如果子进程还没结束,父进程会卡在wait这里,原地等待。

返回值:成功返回被回收子进程PID;失败返回‑1。

参数wstatus用来保存子进程退出状态,配合一组宏使用:

WIFEXITED(wstatus) 判断子进程是否正常退出
WEXITSTATUS(wstatus) 获取子进程退出返回值
WIFSIGNALED(wstatus) 判断进程是不是被信号杀死
WTERMSIG(wstatus) 获取杀死进程的信号编号

八、waitpid函数

我们知道子进程退出之后,如果父进程不去回收它,子进程就会变成僵尸进程,仍然占用系统资源。waitpid就是用来回收指定子进程的系统调用。

pid_t waitpid(pid_t pid, int *wstatus, int options);
参数说明

  1. pid:想要回收的子进程PID
  2. wstatus:指针,用来保存子进程退出状态信息,传NULL代表不关心退出状态
  3. options:选项
    0:阻塞回收。子进程没有退出,父进程就卡在这一行,一直等子进程结束。
    WNOHANG:非阻塞回收。如果子进程还没结束,函数直接返回0,父进程不会卡住,可以继续干别的事。

返回值
成功:返回被回收的子进程pid
失败:返回-1
设置WNOHANG时,如果子进程还没有结束,返回0

wait只能随便等待任意一个子进程;waitpid可以精准指定回收哪一个子进程,还能选择阻塞或者非阻塞,处理僵尸进程更加灵活。

九、exec函数族:进程内部执行另一套程序

fork创建子进程之后,子进程复制父进程的代码。如果我们想要子进程去跑一个完全不一样的程序,就需要exec函数族。
exec不会创建新进程,它复用当前进程的PID,直接把原来的代码替换成新程序的代码。执行成功之后,后面的代码全部不会再运行。
一共有6个exec系列函数,名字后缀有含义:
l:list,参数以列表形式逐个传,最后必须以NULL结尾
v:vector,参数放到指针数组里面传进去
p:会去系统环境变量PATH路径里面查找程序文件,不用写完整路径
e:可以自己传入自定义环境变量
int execl(const char *path, const chararg, …/(char *)NULL */);
int execlp(const char *file, const chararg, …/(char *)NULL */);
int execle(const charpath, const chararg, …/,(char)NULL, char *const envp[] */);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);

返回值特点
exec执行成功没有返回值,原程序代码直接被覆盖;
只有执行失败的时候,才会返回‑1,继续运行后面代码。

区分:
带p:不用写完整路径,依靠PATH找程序;不带p,必须写程序完整路径。
带l:一个个罗列参数;带v:把参数放到字符串数组。
带e:可以自定义环境变量。

十、环境变量

环境变量就是进程运行时,临时存放配置信息的变量。比如我们经常见到的PATH,就是环境变量,系统靠它寻找可执行程序。

环境变量是继承关系:父进程的环境变量,默认会复制给子进程。exec执行新程序的时候,默认沿用原有环境变量,如果使用带e后缀的exec函数,可以传入一套全新环境变量。

setenv 修改环境变量
int setenv(const char *name, const char *value, int overwrite);
参数:

  1. name:环境变量名字
  2. value:要设置的值
  3. overwrite:是否覆盖旧值
    非0:如果这个变量已经存在,覆盖原来的值
    0:已经存在则不做修改,保留旧值

返回值:成功返回0;失败返回‑1。

这部分是进程编程的重点,写fork子进程调用exec执行外部程序,搭配waitpid回收,是非常经典的代码模型。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/27 8:36:04

Altium Develop 注册、安装、使用教程

按实际使用顺序说明从注册到开始设计的完整流程。 一、注册并激活 1. 进入 Altium 官网 使用浏览器访问 Altium 官方网站: Altium 官网 (解决方案 - > Altium Develop,确认当前选择的是Altium Develop页面。) 填写邮件后提交…

作者头像 李华
网站建设 2026/8/27 8:30:51

PLC编程全流程解析:从需求到交付的工业自动化实战指南

1. 从“黑盒子”到“神经中枢”:理解PLC编程的本质 如果你刚接触工业自动化,可能会觉得PLC(可编程逻辑控制器)是个神秘的黑盒子,一堆复杂的梯形图和指令,让人望而生畏。但在我干了十几年自动化项目后&#…

作者头像 李华
网站建设 2026/8/27 8:29:51

数学建模竞赛中车辆路径问题的求解策略:从模型构建到算法实现

1. 赛题核心解读与破题思路 2023年大湾区杯数学建模竞赛的B题,其核心在于解决一个典型的资源优化与路径规划问题,通常涉及城市物流、应急物资调度或交通网络优化等场景。这类题目在数学建模竞赛中非常经典,但每年都会通过不同的背景设定和约束…

作者头像 李华
网站建设 2026/8/27 8:29:47

论文省心了!盘点2026年巅峰之作的的AI论文网站

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文网站,覆盖选题构思、文献整理、内容生成、降重润色、格式排版全流程,真正帮你高效搞定论文。 一、全流程王者:一站式搞定论文全链路(一天定稿首选…

作者头像 李华
网站建设 2026/8/27 8:28:03

SpringBoot项目从零搭建:五个常见坑与避坑建议

踩坑,不是坏事,但重复踩同一个坑,就是浪费生命。我见过太多团队在SpringBoot项目刚起步时,用一周时间搭骨架,然后用三个月时间给当初的草率决定还债。今天这篇,不谈理论,直接把我自己反复踩过、…

作者头像 李华
网站建设 2026/8/27 8:26:50

床垫透气性与防潮性能技术解析:材料结构如何影响湿气管理

海南属热带海洋性季风气候,全年平均相对湿度常年在 75%–85% 间波动,回南天与台风季短时可逼近饱和。床垫内部湿气能否顺畅排出,直接决定霉变与老化风险。本文拆解「海口防潮床垫」应具备的技术条件;参数取自行业公开区间&#xf…

作者头像 李华