【Linux系统编程】第十七弹---进程理解
✨个人主页: 熬夜学编程的小林
💗系列专栏: 【C语言详解】 【数据结构详解】【C++详解】【Linux系统编程】
目录
1、进程的基本概念
2、描述进程-PCB
2.1、什么是PCB
2.2、为什么要有PCB
3、task_ struct
3.1、启动进程
3.2、创建进程
3.3、一次创建多个进程
3.4、task_ struct内容分类
3.5、查看进程内容
总结
1、进程的基本概念
课本概念:程序的一个执行实例,正在执行的程序等。
内核观点:担当分配系统资源(CPU时间,内存)的实体。
1. 如何用通俗易懂的话来理解进程呢???
进程 == PCB(进程控制块) + 进程对应的的代码和数据。一个进程对应一个PCB 。
注意:可执行程序加载到内存不是进程,只是进程对应的代码和数据。
2、描述进程-PCB
2.1、什么是PCB
进程信息被放在一个叫做PCB(进程控制块)的数据结构中,可以理解为进程属性的集合。
课本上称之为PCB(process control block), Linux操作系统下的PCB是: task_struct。
task_struct 是 PCB的一种,在Linux中描述进程的结构体叫做task_struct。
task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
struct PCB
{//所有属性struct PCB* next;//内存指针
}
因此对进程的管理变成了对链表的增删查改。
2.2、为什么要有PCB
因为操作系统要对进程进行管理,管理需要先描述再组织,而PCB是对进程的描述。
3、task_ struct
3.1、启动进程
1、./可执行程序,本质就是让系统创建进程并运行(包括:自己写代码形成的可执行程序,系统命令,可执行文件)。在Linux中运行的大部分指令操作,本质就是运行进程!!!
2、每一个进程都要有自己唯一的标识符,叫做进程的pid(进程id)。
3、一个进程,想知道自己的pid???
方式一:通过指令查看pid
ps指令:
语法:
ps [选项]
功能:
显示当前终端会话中属于当前用户的进程列表。
常见选项:
-a : 显示跟当前终端关联的所有进程
-j : 工作格式
-x : 显示所有进程,不以终端机来区分
此处使用固定格式查看:
ps -ajx | head -1 && ps -ajx | grep 可执行文件
# &&表示前后命令都要按照顺序执行,此处表示先查看该命令的第一行再查看有关可执行程序的信息
方式二:通过调用系统函数
操作系统对进程进行管理,但是用户不能直接访问操作系统,因此需要通过系统提供的系统调用函数来管理进程。
查看pid的函数为getpid();
可以通过man手册进行查询,输入命令: man getpid
通过创建一个C语言代码来查看pid:
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>int main()
{while(1){printf("I am a process,pid: %d\n",getpid());//查看pidsleep(1);//打印一次之后休眠一秒}return 0;
}
4、ctrl + c 在用户层面终止进程 kill -9 pid 杀掉进程
注意:kill掉任意一个进程不会影响另一个进程!!! (进程保证独立性)
5. ppid (父进程id)
前面获取pid的函数后面还有ppid函数,此处通过代码查看ppid。
为什么进程每次启动pid会变但是ppid不会变呢???
我们先查看一下父进程是什么,输入该命令:
ps -axj | head -1 && ps -axj | grep ppid
通过查看可以看到该进程是bash进程(命令行解释器),因此就很好理解了。
- 当我们运行一个进程时,命令行解释器会把这个指令解释成bash的子进程。
- 接着再由这个bash的子进程执行对应的命令。
- 即:每一条命令被执行,都属于bash的子进程,只是子进程不一样。
如何理解子进程不一样呢?
就像我们高考考上北京大学,当年会给我分配一个学号,但是有一天我不想读了,我又重新高考进入北京大学,此时的学校还是北京大学,但是学号就不一样了。
补充:
为了更好看到执行程序与进程信息,可以使用shell脚本,隔一秒查一次进程
while : ; do ps ajx | head -1 && ps ajx | grep myprocess; sleep 1; done
3.2、创建进程
创建跟上面查看进程一样,需要调用系统提供的函数。创建进程的函数为fork();fork之后,父子代码共享。
使用man手册查看fork()函数,输入命令:man fork
创建一个进程,本质是系统中多了一个进程,多一个进程就多一个内核数据结构+自己的代码和数据。父进程的代码和数据从硬盘上加载来的。子进程的代码和数据从哪来呢?? 默认情况继承父进程的代码和数据。
怎么证明是子进程呢???
使用C语言代码创建进程来证明:
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>int main()
{fork();//创建进程printf("hello world,pid: %d,ppid: %d\n",getpid(),getppid());//查看进程对应信息return 0;
}
为什么要创建子进程?
我们想让子进程执行和父进程不一样的代码。提高运行效率。
接下来我们就对父子进程写入不一样的代码,此处需要用到fork函数的返回值。
继续使用C语言代码来实现:
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>int main()
{printf("process is running,only me!,pid: %d\n", getpid());sleep(3);pid_t id = fork();if (id == -1) return -1; //进程创建错误直接退出else if (id == 0){//child 子进程代码while (1){printf("id: %d,I am child process,pid: %d,ppid: %d\n", id, getpid(), getppid());sleep(1);}}else{//parent 父进程代码while (1){printf("id: %d,I am parent,pid: %d,ppid: %d\n", id, getpid(), getppid());sleep(2);}}return 0;
}
1.不同进程执行不同的代码是实现出现了,但是同一个id怎么可能既是等于0,又是大于0?
此处与虚拟地址空间,父子进程写时拷贝有关,暂时不做讲解。
2. fork有两个返回值怎么解释呢???
fork是一个函数,只不过是OS(操作系统)提供的。
函数内部父子进程已经存在。可以被调度了。
由于在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。因此fork函数会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的。
3.3、一次创建多个进程
创建多个进程实际就是多次使用fork函数即可,此处继续用C语言代码进行实现。
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
void RunChild()
{while (1){printf("I am a child process,pid: %d,ppid: %d\n", getpid(), getppid());sleep(1);}
}
int main()
{const int num = 5;for (int i = 0; i < num; i++){pid_t id = fork();if (id == 0){RunChild();//运行子进程代码}sleep(1);}while (1){sleep(1);printf("I am parent,pid: %d,ppid: %d\n", getpid(), getppid());}return 0;
}
补充:
为了更好看到执行程序与进程信息,可以使用shell脚本,隔一秒查一次进程,且不查看grep进程信息。
while : ; do ps ajx | head -1 && ps ajx | grep myprocess | grep -v grep; sleep 1; done
3.4、task_ struct内容分类
★ 标示符: 描述本进程的唯一标示符,用来区别其他进程。
★ 状态: 任务状态,退出代码,退出信号等。
★ 优先级: 相对于其他进程的优先级。
★ 程序计数器: 程序中即将被执行的下一条指令的地址。
★ 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
★ 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
★ I/ O状态信息: 包括显示的I/O请求,分配给进程的I/ O设备和被进程使用的文件列表。
★ 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
★ 其他信息
3.5、查看进程内容
ls /proc/pid -d # 按照目录查看
ls /proc/pid -l # 查看进程内容
使用一个简单的C语言代码测试:
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{while (1){printf("I am process,pid: %d,ppid: %d\n", getpid(), getppid());sleep(1);}return 0;
}
注意:只有运行可执行程序才能查到该进程目录。
该进程目录有很多内容,此处只截取了一部分内容,暂时我们需要知道的是两个链接文件,cwd(表示进程当前工作路径)---current work dir,exe(可执行程序路径)。
1. 如果我们在此处把可执行程序给删除,进程还会不会运行呢???
根据我们的现象是,进程还会运行,而且可执行程序也确实被删除了。进程还能继续运行的原因是,删除的是硬盘上的可执行程序,而原则上内存中还有该可执行程序(该可执行程序大小小于内存大小),但是进程超过内存的大小,运行则就可能出问题。
2. 当前工作路径有什么用呢?
我们在C语言中学习的文件操作,fopen("log.txt","w");默认是在当前目录创建文件,但是我们不一定每次都在当前目录创建文件,那怎么才能在其他目录下创建文件呢?这就是当前工作目录的意义。
修改当前工作路径需要用到一个函数,输入命令:man chdir
测试代码:
#include<stdio.h>
#include<unistd.h>int main()
{chdir("/home/jkl");//更改工作目录为/home/jklFILE* pf = fopen("log.txt", "w");//创建文件(void)pf;//忽略警告 fclose(pf);while (1){printf("I am a process,pid: %d\n", getpid());sleep(1);}return 0;
}
每个进程在启动的时候,会记录自己在哪个路径下启动,进程的当前路径。
fopen("log.txt","w"); 即会在进程的当前路径下新建文件。
总结
本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!
相关文章:

【Linux系统编程】第十七弹---进程理解
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、进程的基本概念 2、描述进程-PCB 2.1、什么是PCB 2.2、为什么要有PCB 3、task_ struct 3.1、启动进程 3.2、创建进程…...

【网络安全入门】你必须要有的学习工具(附安装包)零基础入门到进阶,看这一篇就够了!
工欲善其事必先利其器 在新入门网络安全的小伙伴而言。这些工具你必须要有所了解。本文我们简单说说这些网络安全工具吧! Web安全类 Web类工具主要是通过各种扫描工具,发现web站点存在的各种漏洞如sql注入、xss等。从而获取系统权限,常用的…...

【解决】:git clone项目报错fatal: fetch-pack: invalid index-pack output
象:之前一直使用gitee将个人学习和工作相关记录上传到个人gitee仓库,一直没出现过问题。直到有一天换电脑重新拉取代码发现出了问题,具体如下图: 原因分析: 经过查询发现主要原因是因为git clone的远程仓库的项目过大…...

python随机显示四级词汇
python实现一个浮动窗口随机显示四级单词在桌面跑来跑去 实现一个浮动窗体随机显示四级单词在windows桌面置顶移动 tkinter库来创建窗口和显示单词,以及random库来随机选择单词。 使用after方法来定时更新窗口的位置,实现单词窗口的慢慢移动效果 使用…...

vuerouter声明式导航
声明式导航-跳转传参数 1.查询参数传参 语法:to /path?参数名值 2.对应页面组件接受传来的值 $router.query.参数名 2.动态路由传参 1.配置动态路由 2.配置导航连接 to/path/参数值 3.对应页面组件接收传递过来的值 #route.params.参数名 多个参数传递&…...

视频断点上传
什么是断点续传 通常视频文件都比较大,所以对于媒资系统上传文件的需求要满足大文件的上传要求。http协议本身对上传文件大小没有限制,但是客户的网络环境质量、电脑硬件环境等参差不齐,如果一个大文件快上传完了网断了没有上传完成…...

清华团队开发首个AI医院小镇模拟系统;阿里云发布通义千问 2.5:超越GPT-4能力;Mistral AI估值飙升至60亿美元
🦉 AI新闻 🚀 清华团队开发首个AI医院小镇模拟系统 摘要:来自清华的研究团队最近开发出了一种创新的模拟系统,名为"Agent Hospital",该系统能够完全模拟医患看病的全流程,其中包括分诊、挂号、…...

React Suspense与Concurrent Mode:探索异步渲染的新范式
React的Suspense和Concurrent Mode是两个强大的特性,它们共同改变了React应用处理异步数据加载和UI渲染的方式。下面我将通过一个简化的代码示例来展示如何使用这两个特性。 Concurrent Mode 和 Suspense 的基本用法 首先,确保你使用的是支持这些特性的…...

算法训练营day37
动态规划 1.斐波那契数 1.使用数组存储子问题结果 class Solution {public int fib(int N) {if (N 0) return 0;int[] dp new int[N 1];// base casedp[0] 0; dp[1] 1;// 状态转移for (int i 2; i < N; i) {dp[i] dp[i - 1] dp[i - 2];}return dp[N];} }2.使用变…...

基础ArkTS组件:帧动画,内置动画组件,跑马灯组件(HarmonyOS学习第三课【3.6】)
帧动画 帧动画也叫序列帧动画,其原理就是在时间轴的每帧上逐帧绘制不同的内容,使其连续播放而成动画。ArkUI开发框架提供了 ImageAnimator 组件实现帧动画能力,本节笔者介绍一下 ImageAnimator 组件的简单使用。 官方文献 说明 该组件从A…...

vant NavBar 导航栏详解
vant 是一个基于 Vue 的移动端 UI 组件库,而 NavBar 是其中的一个导航栏组件。下面是对 vant 的 NavBar 导航栏组件的详细解释: 1. 引入 NavBar 首先,你需要在你的 Vue 组件中引入 NavBar 组件: import { NavBar } from vant; …...

Python自动化办公实战案例:文件整理与邮件发送
目录 一、引言 二、案例背景 三、实战案例 (一)文件自动整理 (二)邮件自动发送 四、结语 一、引言 随着办公自动化的兴起,Python作为一门强大的编程语言,逐渐被应用于日常办公中。从文件整理到邮件…...

2024中国(重庆)无人机展览会8月在重庆举办
2024中国(重庆)无人机展览会8月在重庆举办 邀请函 主办单位: 中国航空学会 重庆市南岸区人民政府 招商执行单位: 重庆港华展览有限公司 报名:【交易会I 59交易会2351交易会9466】 展会背景: 为更好的培养航空航天产业和无人…...

自动驾驶技术与传感器数据处理
目录 自动驾驶总体架构 感知系统 决策系统 定位系统 计算平台 仿真平台 自动驾驶公开数据集 激光点云 点云表征方式 1) 原始点云 2) 三维点云体素化 3)深度图 4)鸟瞰图 点云检测障碍物的步骤 PCL点云库 车载毫米波雷达 车载相机 设备标定 自动驾驶…...

高效测评系统方案助力沃尔玛、亚马逊卖家提升产品销量
无论在哪个电商平台,测评确实是最有效的推广方式。测之前一定要选好产品,因为对于大部分卖家而言,不可能你店铺里所有的都是爆款,所以选择的是需要有潜力成为爆款的产品。测评是指通过搭建安全的环境模拟真实的买家购物行为&#…...

B/S模式的web通信(高并发服务器)
这里写目录标题 目标实现的目标 服务器代码(采用epoll实现服务器)整体框架main函数init_listen_fd函数(负责对lfd初始化的那一系列操作)epoll_run函数do_accept函数do_read函数内容补充:http中的getline函数 详解do_re…...

C语言每日一题—约瑟夫问题
13个人围成一圈,从第1个人开始顺序报号1、2、3,凡报到3的人退出圈子。找出最后留在圈子里的人原来的序号。要求用结构体编程实现。***输出提示:"\n出圈成员及顺序:" ***输出格式:"%3d" ***输出提示…...

语言:C#
一、VSCode生成exe 二、...

[力扣题解]45. 跳跃游戏 II
题目:45. 跳跃游戏 II 思路 贪心法; 只需记录2个变量,当前点能达到的最远距离,和上一步能到达的最远距离; (真有意思,代码随想录给出的是curDistance,nextDistance2个,…...

pywinauto操作windows应用(未完成)
pywinauto 脚本制作 一 、获取窗口句柄 首先获取句柄,其次扫描组件,然后对按钮和文本进行操作 安装依赖 pip install pywin32 -i https://pypi.doubanio.com/simple扫描全部的句柄 import win32gui# GetDesktopWindow 获得代表整个屏幕的一个窗口&a…...

(超详细讲解)实现将idea的java程序打包成exe (新版,可以在没有java的电脑下运行,即可以发给好朋友一起玩)
目录 实现打包到exe大概步骤 工具准备 1.将java程序文件打包成jar文件 2.准备好jre文件 3.使用exe4j软件打包好 4.最终打包 实现打包到exe大概步骤 1.打包需要满足的条件:将java文件转成jar文件的工具exe4j、 以及需要满足jdk1.8以上(因安装exe4…...

学习软考----数据库系统工程师29
数据操作 SELECT基本结构 简单查询 连接查询 子查询 聚集函数 分组查询 字符串操作 集合操作 外连接 INSERT INTO语句 DELETE语句 UPDATE语句...

STL中的优先级队列
目录 1.引言 2.简介 3.基本操作 4.实现原理 5.自定义优先级比较 6.相关题目 7.能特点 8.总结 1.引言 在C标准库中,优先级队列是一种非常有用的数据结构,它允许我们根据元素的优先级来对其进行排序和访问。这种数据结构在多种应用场景中都发挥着重…...

浅谈Acrel-2000ES储能能量管理系统的设计与应用-安科瑞 蒋静
0 前言 为进一步提升河南省分布式光伏发电发展水平,促进行业健康可持续发展,河南省发布关于促进分布式光伏发电健康可持续发展的通知。对于储能行业,可以用到安科瑞Acrel-2000ES储能能量管理系统。 储能柜EMS能量管理系统 1、产品名称 储…...

会员卡积分小程序系统源码商业运营版 行业一站式解决方案附带源代码以及搭建安装部署教程
系统概述 会员卡积分小程序系统源码商业运营版是一套完整的会员卡积分系统解决方案,包含前端小程序、后端管理系统以及数据库设计。该系统支持多种会员卡类型、积分规则设定、积分兑换、优惠券发放等功能,满足企业对于会员积分管理的各种需求。同时&…...

uniapp 百度地图 拖动获取经纬度级搜索连用
import loadBMap from /utils/loadBMap.js// 百度聚合具体代码 // 拖动 initMapc() {let that thisloadBMap(百度key).then(() > {map new BMap.Map(mapContainer)const centerPoint new BMap.Point(this.longitude, this.latitude)map.centerAndZoom(centerPoint, this.…...

Yarn的安装和使用详细教程(Mac/Window)
目录 Yarn是什么? Mac安装Yarn 使用Homebrew安装Yarn 使用npm安装Yarn Windows安装Yarn 使用npm安装Yarn Yarn使用 常用命令: 特殊命令: Yarn是什么? Yarn是一个流行的包管理工具,用于管理JavaScript项目的依…...

高考志愿系统-学生管理模块分析
1.获取学生信息: 接口:http://localhost:81/dev-api/college_entrance/student/list?pageNum1&pageSize10 请求方式get 默认传参pageNum和pageSize,表示当前页,每页展示数量 首先通过startPage()方法获取分页参数当前页&…...

【问题实操】银河高级服务器操作系统实例分享,开机之后反复重启
1.服务器环境以及配置 物理机/虚拟机/云/容器 物理机 外网/私有网络/无网络 私有网络 处理器: PHYTIUM FT2000PLUS 2200 MHz 内存: 128 GiB 整机类型/架构: HIKVISION DS-V BIOS版本: HK 601FBE02HK 网卡࿱…...

攻防世界-web-unseping
题目 知识点 PHP代码审计PHP序列化和反序列化PHP中魔术方法命令执行绕过方式 解读源码 <?php highlight_file(__FILE__);class ease{private $method;private $args;function __construct($method, $args) {$this->method $method;$this->args $args;}function …...