news 2026/7/6 20:05:56

Linux系统编程2(进程)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux系统编程2(进程)

一、进程基础定义

进程是程序的执行过程,操作系统会为其分配内存、CPU 等系统资源。

1.1 进程控制块(PCB)

PCB(Process Control Block)是内核中的结构体,用于存储进程的所有关键信息,是操作系统管理进程的核心数据结构:
(1)PID:进程唯一标识符
(2)当前工作路径(可通过chdir修改)
(3)umask(默认文件权限掩码,如 0002)
(4)进程打开的文件描述符列表(关联文件 IO)
(5)信号相关配置(处理异步事件)
(6)用户 ID、组 ID(权限控制)

1.2 进程资源限制

Linux 系统对进程资源有默认限制(可通过ulimit修改):
最大打开文件数:1024
栈空间大小:8M

二、进程与程序的核心区别

维度程序(Program)进程(Process)
状态静态(硬盘中代码 + 数据的集合)动态(程序的执行过程)
生命周期永久存在(文件形式)临时存在(创建 → 调度 → 消亡)
状态变化有(运行 / 阻塞 / 就绪 等)
并发能力支持并发执行
资源占用不占用系统资源占用 CPU、内存、文件描述符等资源
关联关系一个程序可运行为多个进程一个进程可加载运行一个程序(同一程序可被多次加载)

:.c源文件→编译为a.out程序→运行a.out生成进程(分配 PID)

三、进程的内存管理

3.1 虚拟内存与 MMU

隔离性:多进程环境中,进程 A 无法直接访问进程 B 的内存空间(由 MMU(内存管理单元)实现地址映射)
安全性:通过权限控制限制进程对内核空间的访问,避免任意修改系统核心数据

3.2 进程内存空间划分

进程拥有独立的虚拟内存空间(32 位系统默认 4G)
包括
(1)0~3GB用户空间:代码段(.text)、数据段(.data/.bss)、堆(heap)、共享库区域、栈(stack)
(2)3~4GB内核空间:存放内核核心代码、物理内存映射、进程内核态数据结构、硬件I/O映射及内核动态分配资源的共享区域

四、进程分类

4.1 交互式进程

说明:依赖用户输入触发执行,如终端命令行、图形界面应用(vim、chrome)
特点:响应性优先,需快速处理用户操作

4.2 批处理进程

说明:无需用户交互,批量执行预设任务,如 Shell 脚本、定时任务(crontab)
特点:吞吐量优先,后台静默运行

4.3 守护进程(Daemon)

说明:系统启动后自动运行,长期驻留后台,等待特定条件触发(如定时更新、网络请求监听)
示例:sshd(SSH 服务)、crond(定时任务守护进程)、杀毒软件后台进程
特点:独立于终端,父进程通常为init(PID=1)

五、进程的核心作用:并发

宏观并行:一个时间段内多个进程看似同时运行(如同时打开浏览器、编辑器)
微观串行:任意时刻 CPU 仅能执行一个进程(单核),通过进程切换实现 “并发”

六、进程状态与调度

6.1 Linux 进程状态

运行态(R):正在执行或等待 CPU
阻塞态(S/D):等待资源(如 IO、信号)
暂停态(T):被信号暂停(如SIGSTOP)
僵尸态(Z):进程终止但 PCB 未被回收
死亡态(X):进程完全销毁(不可见)

6.2 进程调度算法

操作系统通过调度算法决定 CPU 分配策略:
(1)时间片轮转:每个进程分配固定时间片,轮流执行
(2)短任务优先:优先执行运行时间短的进程
(3)进程优先级:Linux 通过nice值(-20~19)设置优先级,值越低优先级越高
(4)完全公平调度(CFS):Linux 默认调度算法,按进程 CPU 使用比例分配时间

6.3 进程上下文切换

当进程时间片耗尽或被抢占时,操作系统需保存当前进程的上下文(PCB、寄存器、内存映射等),加载下一个进程的上下文,实现进程切换。
(1)保存:将进程状态写入 PCB,缓存到内存(非硬盘)
(2)恢复:从 PCB 加载进程状态,恢复执行

七、进程相关命令

命令功能描述示例
ps aux查看所有进程的详细信息ps aux | grep sshd
top实时监控进程资源占用直接执行top
kill向进程发送信号kill -9 1234(强制终止 PID=1234 的进程)
killall按进程名终止进程killall -9 a.out
ulimit -a查看进程资源限制直接执行ulimit -a

说明
(1)kill -9 是 SIGKILL,不可被捕获,慎用
(2)正常结束进程推荐:kill PID(默认 SIGTERM)
(3)ps aux 中的 a u x 是固定组合,不要漏写

八、进程编程核心函数(C 语言)

8.1 进程创建:fork()

#include<unistd.h>pid_tfork(void);

功能:从当前进程(父进程)克隆一个子进程
特性
(1)一次调用,两次返回(父进程返回子进程 PID,子进程返回 0)
(2)父子进程执行顺序不确定(由调度器决定)
(3)子进程复制父进程的 0~3G 用户空间及 PCB(PID 不同)
(4)Linux 2.6 + 采用写时复制(COW) :初始共享父进程内存,仅当修改时才分配独立空间
(5)失败返回 - 1(如进程数达到上限)

8.2 获取进程 ID:getpid()/getppid()

#include<unistd.h>pid_tgetpid(void);// 获取当前进程PIDpid_tgetppid(void);// 获取父进程PID

8.3 进程终止

(1)正常终止
①main函数return:仅适用于主线程,返回值为进程退出状态
②exit(int status)(C 库函数):执行清理工作(刷新缓冲区、关闭文件流、调用atexit注册的退出函数);status:退出状态(0 表示成功,非 0 表示失败),可通过EXIT_SUCCESS/EXIT_FAILURE宏
③_exit(int status)/_Exit(int status)(系统调用):直接终止进程,不执行缓冲区刷新和清理函数
(2)异常终止
①abort():触发SIGABRT信号,强制终止
②外部信号(如kill -9发送SIGKILL)
③线程相关:主线程退出、pthread_exit(主线程)、pthread_cancel(最后一个线程)

8.4 进程回收:wait()/waitpid()

(1)wait()(阻塞回收)

#include<sys/wait.h>pid_twait(int*status);

功能:阻塞等待任意子进程退出,并回收该进程的状态(仅父进程可回收子进程)
参数:status:存储子进程退出状态(NULL 表示不关心);若需获取退出状态,需结合宏解析
返回值:成功:返回被回收的子进程 PID; 失败:返回 - 1
状态解析宏

功能
WIFEXITED(status)判断子进程是否正常结束(通过returnexit
WEXITSTATUS(status)获取子进程正常结束时的退出码
WIFSIGNALED(status)判断子进程是否被信号终止
WTERMSIG(status)获取终止子进程的信号编号

示例

if(WIFEXITED(status)){printf("exit code = %d\n",WEXITSTATUS(status));}elseif(WIFSIGNALED(status)){printf("killed by signal %d\n",WTERMSIG(status));}

(2)waitpid()(支持阻塞 / 非阻塞回收)

#include<sys/wait.h>pid_twaitpid(pid_tpid,int*status,intoptions);

功能:指定回收某个 / 所有子进程,支持阻塞 / 非阻塞模式
等价关系:waitpid(-1, status, 0) = wait(status)
参数
①pid:指定回收的子进程(-1 表示所有子进程,>0 表示指定 PID 的子进程)
②status:子进程退出状态(NULL 表示不关心)
③options:0:阻塞模式(等待子进程退出后回收); WNOHANG:非阻塞模式(立即返回,不等待)
返回值
①成功:返回被回收的子进程 PID
②0:非阻塞模式下,无子进程退出(需后续重试)
③-1:调用失败(如无可用子进程)
非阻塞回收示例:需在外层套死循环,轮询检测子进程是否退出

8.5 进程程序替换:exec 族函数

(1)核心功能
执行系统中任意可执行文件,常与fork()搭配使用(子进程中执行exec);从内存角度,执行exec的进程代码段会被新程序替换,新程序执行结束则整个进程终止。
(2)函数命名规则
l(list):参数以列表形式逐个传入,以 NULL 结尾
v(vector):参数存储在字符串数组中,数组最后一个元素为 NULL
p(PATH):仅需传入文件名,系统自动从环境变量PATH中查找程序路径
(3)常用 exec 函数

函数原型说明
int execl(const char *path, const char *arg, ...);path:程序完整路径 + 文件名;
arg:参数列表(以NULL结尾)
int execlp(const char *file, const char *arg, ...);file:程序文件名(依赖PATH环境变量查找);
arg:参数列表(以NULL结尾)
int execv(const char *path, char *const argv[]);path:程序完整路径 + 文件名;
argv:参数数组(以NULL结尾)
int execvp(const char *file, char *const argv[]);file:程序文件名(依赖PATH环境变量查找);
argv:参数数组(以NULL结尾)

通用规则:若需调用自定义可执行程序,无论使用哪个exec函数,第一个参数按 “完整路径 + 文件名” 填写均可成功调用。

8.6 系统命令执行:system ()

#include<stdlib.h>intsystem(constchar*command);

功能:执行指定 Shell 命令,内部通过fork+exec实现
注意事项:不能执行修改父进程状态的命令,适合执行信息输出、文件操作类命令
参数:command:待执行的 Shell 命令(如"ls -l")
返回值:-1 表示调用失败

8.7 工作路径操作函数

(1)获取当前工作路径:getcwd ()

#include<unistd.h>char*getcwd(char*buf,size_tsize);

参数
buf:存储路径的字符数组
size:字符数组的最大长度
返回值
成功:指向buf的指针
失败:NULL

(2)修改当前工作路径:chdir ()

#include<unistd.h>intchdir(constchar*path);

参数:path:目标路径(绝对 / 相对路径均可)
返回值:-1 表示调用失败…

九、特殊进程

9.1 僵尸进程

产生原因:子进程终止后,父进程未调用wait()/waitpid()回收其 PCB
危害:长期占用内核 PCB 资源,导致内核内存不足
解决:父进程及时回收子进程;父进程退出后,子进程由init进程接管并回收

9.2 孤儿进程

产生原因:父进程先于子进程终止,子进程成为 “孤儿”
处理:子进程被init进程(PID=1)收养,由init负责回收其资源
特点:无危害,无需特殊处理

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

GitHub热门项目推荐:基于Qwen3-VL-8B的开源视觉模型

GitHub热门项目推荐&#xff1a;基于Qwen3-VL-8B的开源视觉模型 在智能应用日益渗透日常生活的今天&#xff0c;用户不再满足于“能看”或“能说”的单一功能。他们期望系统真正“理解”图像背后的语义——比如看到一张露营照片时&#xff0c;不仅能识别出帐篷和篝火&#xff0…

作者头像 李华
网站建设 2026/7/7 19:33:30

清华源同步gpt-oss-20b更新频率有多快?

清华源同步gpt-oss-20b更新频率有多快&#xff1f; 在大模型热潮席卷全球的今天&#xff0c;GPT-4 等闭源巨擘固然耀眼&#xff0c;但它们高昂的部署成本、不可控的推理延迟和数据外泄风险&#xff0c;让许多研究机构与中小企业望而却步。尤其是在国内环境下&#xff0c;国际带…

作者头像 李华
网站建设 2026/7/7 18:17:58

终极OpenWrt主题美化指南:Argon主题深度配置与问题解决

终极OpenWrt主题美化指南&#xff1a;Argon主题深度配置与问题解决 【免费下载链接】luci-theme-argon Argon is a clean and tidy OpenWrt LuCI theme that allows users to customize their login interface with images or videos. It also supports automatic and manual s…

作者头像 李华
网站建设 2026/7/6 22:48:42

RAG模型:大语言模型的生成质量突破

深入探讨RAG模型&#xff1a;提升大语言模型生成质量 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;大语言模型&#xff08;LLM&#xff09;如GPT、BERT等为文本生成任务提供了强大的能力&#xff0c;但它们也面临着一系列挑战&#xff0c;尤其是在信息准确性和时…

作者头像 李华
网站建设 2026/7/7 7:55:12

Miniconda镜像集成方案:打通从开发到部署的最后1公里

Miniconda镜像集成方案&#xff1a;打通从开发到部署的最后1公里 在AI项目频繁迭代的今天&#xff0c;你是否也经历过这样的场景&#xff1f;本地训练好的模型&#xff0c;在CI流水线上跑不通&#xff1b;同事说“在我机器上是正常的”&#xff0c;而你在服务器上反复调试无果&…

作者头像 李华
网站建设 2026/7/7 10:22:26

HttpRunner 测试用例结构:YAML/JSON格式详解

一、测试用例格式选择的重要性 在 API 自动化测试中&#xff0c;测试用例的组织和管理方式直接影响着测试效率和维护成本。HttpRunner 支持 YAML 和 JSON 两种主流格式&#xff0c;这不仅仅是一个技术选择&#xff0c;更是一种工程实践的体现。想象一下&#xff0c;当你需要验证…

作者头像 李华