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

【linux】进程管理:进程控制块、进程号、fork创建进程、特殊进程及exec函数族解析

目录

一、进程的概述

1、程序和进程的区别

 2、单道和多道程序设计

3、并行和并发的区别

 4、进程控制块(PCB)

5、进程的状态

​二、进程号PID

1、获取进程号的函数 

 2、获取父进程的ID

3、获取进程组的ID

三、 fork创建进程

1、fork函数

2、fork出来的子进程和父进程之间的关系 

3、子进程 复制 父进程的资源(各自独立)

​编辑4、父子进程同时运行

​编辑

5、父进程 给子进程 足够的准备时间时 

​四、特殊的进程

1、孤儿进程(无危害)

​2、僵尸进程(有害)

​3、守护进程

​五、父进程回收子进程的资源

1、wait函数

​编辑 2、waitpid函数

​六、创建多个子进程

1、创建2个子进程出现的问题

2、防止子进程 创建孙进程 

七、 进程相关

1、终端 

2、进程组 

 3、会话

​编辑 4、创建守护进程

​编辑八、 vfork创建子进程

1、vfork函数说明 

2、vfork函数和fork函数的区别 

​编辑九、exec函数族

案例1:在代码中使用execl执行ls命令

案例2:在代码中使用execlp执行ls命令 

案例3:在代码中使用execvp执行ls命令 

​编辑 案例4:vfork和exec配合使用,会为子进程开辟新的空间

一、进程的概述

        可执行程序运行起来后(没有结束之前),它就成为了一个进程。程序是存放在存储介质上的一个可执行文件,而进程是程序执行的过程。进程的状态是变化的,其包括进程的创建、调度和消亡。程序是静态的,进程是动态的。

1、程序和进程的区别

        程序 静态的 占磁盘空间(存放在存储介质上的一个可执行文件)

        进程 动态的 (调度、执行、消亡),占内存空间。(进程是程序执行到结束间的这个过 程)

 2、单道和多道程序设计

        单道程序设计 所有进程一个一个排队执行。若A阻塞,B只能等待,即使CPU处于空闲状 态。这种模型在系统资源利用上及其不合理,大部分已被淘汰了。

        多道程序设计 在计算机内存中同时存放几道相互独立的程序,它们在管理程序控制之 下,相互穿插的运行。当下常见CPU为纳秒级,由于人眼的反应速度是毫秒级,所以看似同时在运行。
而多道程序设计必须有硬件基础作为保证。时钟中断(强制让进程让出cpu资源)即为多道程序设计模型的理论基础。

3、并行和并发的区别

        并行(微观)和并发(宏观)都是多个任务同时执行(多道程序)。

        并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行(微观上同时执行)(多核)

        并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执 行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时 间分成若干段,使多个进程快速交替的执行(单核 )

 4、进程控制块(PCB)

        进程运行时,内核为每个进程分配一个PCB(进程控制块),维护进程相关的信 息,Linux内核的进程控制块是task_struct结构体。 PCB存在于进程的内核空间里面。系统会为每一个进程分配一个进程ID,其类型为pid_t(非负整数) ,进程的状态,有就绪、运行、挂起、停止等状态。进程状态切换时需要保存和恢复的一些CPU寄存器。进程是系统分配资源基本单位

5、进程的状态

进程的三大状态:就绪态、执行态、等待态

  • 就绪态:执行条件全部满足,等待CPU的执行调度
  • 执行(运行)态:正在被CPU调度执行
  • 等待态:不具备CPU调度执行的执行条件,等待条件满足。 

状态机:

ps命令查看进程信息: 

选项含义
-a显示终端上的所有进程,包括其他用户的进 程
-u显示进程的详细状态
-x显示没有控制终端的进程
-w显示加宽,以便显示更多的信息
-r只显示正在运行的进程

查看进程状态:ps -aux 

 stat中的参数意义如下:

以树状显示进程:pstree

 二、进程号PID

        每个进程都由一个进程号来标识,其类型为 pid_t(整型),进程号的范围:0~32767。 进程号总是唯一的,但进程号可以重用。当一个进程终止后,其进程号就可以再次使用 。

  • 进程号(PID): 标识进程的一个非负整型数
  • 父进程号(PPID):父进程号
  • 进程组号(PGID): 进程组是一个或多个进程的集合。 

1、获取进程号的函数 

头文件:

#include<sys/type.h>

#include<unistd.h>

函数:

pid_t getpid(void);  

功能: 获取本进程号(PID)

参数: 无

返回值: 本进程号 

 2、获取父进程的ID

#include<sys/type.h>

#include<unistd.h>

pid_t getppid(void);

功能: 获取调用此函数的进程的父进程号(PPID)

参数: 无

返回值: 调用此函数的进程的父进程号(PPID)

3、获取进程组的ID

#include<sys/type.h>

#include<unistd.h>

pid_t getpgid(pid_t pid);

功能: 获取进程组号(PGID)

参数: pid:进程号

返回值: 参数为 0 时返回当前进程组号,否则返回参数指定的进程的进程组号  

查看父子进程号:ps -ef 

 查看所有进程号:ps -ajx

getchar();防止进程结束。 

三、 fork创建进程

1、fork函数

        系统允许一个进程创建新进程,新进程即为子进程,子进程还可以创建新的子进程,形成进 程树结构模型。

#include<sys/types.h>

#include<unistd.h>

pid_t fork(void);

功能: 用于从一个已存在的进程中创建一个新进程,新进程称为子进程,原进程称为父进程。

参数: 无

返回值: 成功:子进程中返回 0父进程中返回子进程 ID。pid_t,为整型。 失败:返回-1。

失败的两个主要原因:

        1)当前的进程数已经达到了系统规定的上限,这时 errno 的值被设置为 EAGAIN。

        2)系统内存不足,这时 errno 的值被设置为 ENOMEM 

2、fork出来的子进程和父进程之间的关系 

         使用fork函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间。 地址空间: 包括进程上下文、进程堆栈、打开的文件描述符、信号控制设定、进程优 先级、进程组号等。 子进程所独有的只有它的进程号,计时器等。因此,使用fork函数的代价是很大的 。

        父子进程从fork后开始继续执行。父子进程是同时运行,空间独立,子进程复制父进程的所有空间,谁先运行不确定。 

#include <stdio.h> #include <unistd.h> int main(int argc,char *argv[]) { //创建子进程 pid_t pid=fork(); if(pid<0) { perror("创建失败\n"); } else if(pid==0) { printf("%d为子进程\n",getpid()); } else if(pid>0) { printf("%d为父进程\n",getpid()); } getchar(); return 0; }
http://www.jsqmd.com/news/1230572/

相关文章:

  • 从Demo到上线:3人出海团队如何用流程补齐与大厂的10倍效率差
  • 在 Visual Studio Code 中配置 Clang-Format 格式化 (排版) 工具
  • 2026年7月最新格拉苏蒂长沙万象城维修保养服务电话 - 亨得利钟表维修中心
  • ARK启动器终极优化指南:五步解决启动慢、卡顿与模组管理难题
  • 深入解析AM275x SoC互连架构:CBASS与QoS性能调优实战
  • 校服质量追溯合规指南:从国标到落地的全流程解析 - GrowthUME
  • 从Jupyter到生产:机器学习模型的可运维性设计与实践
  • 揭序加密技术:实现加密数据高效检索的创新方案
  • 终极桌面整理指南:如何用免费开源工具NoFences让Windows桌面焕然一新
  • LangChain生态工具选型指南:从开发到部署
  • AM64x/AM243x安全配置与调试寄存器实战解析
  • 河源浆板哪家好?2026 实地测评排名 - GrowthUME
  • Cursor新手黄金24小时训练计划(含官方未公开的CLI调试模式+3个内部Prompt诊断指令)
  • cad怎么转pdf哪个好?免费好用工具实测对比 - 软件小管家
  • OpenClaw太折腾?2026年这8款国产“AI龙虾“平替,小白也能5分钟上手
  • Python环境搭建指南:从安装到虚拟环境配置
  • print()大揭秘:如何用Python打印出多样字符
  • Zadig 官方 MCP Server 版本更新:接入更稳、调用更准、审计排障更清晰
  • 美度保养700售后维修保养服务中心权威公示(2026年7月最新) - 亨得利官方服务中心
  • 【2027最新】基于SpringBoot+Vue的图书管理系统管理系统源码+MyBatis+MySQL
  • Python入门:从零到一,掌握核心语法与编程思维
  • UG NX CAM编程实战:从零到一生成G代码的完整流程与核心技巧
  • SSH免密登录配置ssh-keygen -t rsa
  • C++协程异步网络框架详解与实战
  • Mongodb学习笔记,远程连接数据库
  • 2026年上半年,VC一半的钱砸进了AI:6500亿都流向了哪里
  • adb tcpip 5555
  • Slack集成Claude AI:企业级高效协作解决方案
  • 2026 上海浦东空压机上门维修服务商推荐|正规维保挑选参考 - 奔跑123
  • 2026年最新GEO优化收费标准与源头服务商选择指南 - 品牌报告