【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");   即会在进程的当前路径下新建文件

总结


本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/836639.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于微信小程序的预约挂号系统(源码)

博主介绍&#xff1a;✌程序员徐师兄、10年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447…

Ubuntu20.04右键打不开终端

今天用virtualbox安装了ubuntu20.04 问题&#xff1a;右键打开终端&#xff0c;怎么也打开不了&#xff01; 点了也没反应&#xff0c;或者鼠标转小圈圈&#xff0c;然后也没有反应… 解决方法&#xff1a; 1、Ctrl Alt F6 先切换到终端访问界面 mac电脑 Ctrl Alt F6 …

vuerouter声明式导航

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

情感感知OCR:整合深度学习技术提升文字识别系统的情感理解能力

摘要&#xff1a;随着深度学习技术的发展&#xff0c;文字识别&#xff08;OCR&#xff09;系统在识别准确率和速度上取得了长足的进步。然而&#xff0c;在处理文本时&#xff0c;仅仅依靠字符和词语的识别并不足以满足用户对信息的全面理解需求。本文提出了一种新颖的方法&am…

Redis五大基本数据类型介绍及其使用场景

文章目录 1 String&#xff08;字符串&#xff09;应用场景 2 List&#xff08;列表&#xff09;应用场景 3 Set&#xff08;集合&#xff09;4 sorted set&#xff08;有序集合&#xff09;应用场景 5 hash&#xff08;哈希&#xff09;应用场景 Redis 是一个开源&#xff0c;…

彩信群发推广:四大革新优势,引领营销新时代!

在数字化营销日益盛行的今天&#xff0c;短信群发已成为我们生活中不可或缺的一部分。然而&#xff0c;您是否想过&#xff0c;除了传统的文本短信&#xff0c;还有一种更为丰富、更具吸引力的推广方式——彩信群发推广&#xff1f;彩信不仅融合了图片、文字、音频、动画和视频…

【漏洞复现】泛微OA E-Cology ln.FileDownload文件读取漏洞

漏洞描述&#xff1a; 泛微OA E-Cology是一款面向中大型组织的数字化办公产品&#xff0c;它基于全新的设计理念和管理思想&#xff0c;旨在为中大型组织创建一个全新的高效协同办公环境。泛微OA E-Cology ln.FileDownload存在任意文件读取漏洞&#xff0c;允许未经授权的用户…

轨迹规划 | 图解纯追踪算法Pure Pursuit(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 纯追踪算法原理推导2 自适应纯追踪算法(APP)3 规范化纯追踪算法(RPP)4 仿真实现4.1 ROS C仿真4.2 Python仿真4.3 Matlab仿真 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细介绍全局规划…

快速配置 Nginx 来实现 GPT 流式传输

目录 1. Nginx 参考配置2. Nginx 核心参数3. 其他参数 场景&#xff1a;代理 ChatGPT、代理各种 GPT 工具套壳等。 1. Nginx 参考配置 支持 GPT 流式访问的配置如下&#xff0c;请根据实际需求适当取舍即可&#xff1a; server {listen 80;server_name chat.test.com; # 绑…

如何推动物联网的未来?——青创智通

工业物联网解决方案-工业IOT-青创智通 物联网作为连接物理世界和数字世界的桥梁&#xff0c;正逐渐改变着我们的生活和工作方式。在工业领域&#xff0c;物联网技术的应用不仅提高了生产效率&#xff0c;还实现了对设备的智能化管理和维护。而工业网关作为物联网的重要组成部分…

java数据保留几位小数的问题

String.format()&#xff1a; 这个方法在格式化输出时非常常用&#xff0c;可以方便地控制小数位数&#xff0c;并且语法简洁易懂。它不仅可以用于格式化浮点数和双精度数&#xff0c;还可以用于格式化其他数据类型&#xff0c;如整数、字符串等。 示例代码&#xff1a; BigD…

仪器校准中,CNAS对报告的认可评审要求有哪些?

CNAS扩项时&#xff0c;常常会有关于对报告认可的相关要求&#xff0c;而这些要求往往有明确规范&#xff0c;那么在仪器校准中&#xff0c;CNAS对报告的认可评审要求有哪些&#xff1f; 现场评审时&#xff0c;评审组应关注抽查报告&#xff0c;评审组将现场随机抽取报告&…

酷开科技让你能够放心地把遥控器交给孩子

我国电视从诞生至今已有65个年头&#xff0c;从黑白到彩色&#xff0c;从背投到液晶&#xff0c;电视的外观随着时代技术的发展而不断变化&#xff0c;直到现在随着技术的不断迭代&#xff0c;电视的功能越来越丰富&#xff0c;电视在客厅中的地位也越来越凸显。作为家庭娱乐的…

【Linux基础】Vim保姆级一键配置教程(手把手教你把Vim打造成高效率C++开发环境)

目录 一、前言 二、安装Vim 三、原始Vim编译器的缺陷分析 四、Vim配置 &#x1f95d;预备知识----.vimrc 隐藏文件 &#x1f34b;手动配置 Vim --- &#xff08;不推荐&#xff09; &#x1f347;自动化一键配置 Vim --- (强烈推荐) ✨功能演示 五、共勉 一、前言 Vim作为…

实现字符串比较函数(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int i, result;char s1[100], s2[100];//填充数组&#xff1b;printf("请输入数组s1的…

2.分布式-算法

目录 一、限流算法有哪些&#xff1f; 1.计数器算法&#xff08;Counter-Based Algorithm&#xff09; 2.固定窗口算法&#xff08;Fixed Window&#xff09; 3.滑动窗口算法&#xff08;Sliding Window&#xff09; 4.令牌桶算法&#xff08;Token Bucket&#xff09; 5.…

生产设备数据管控要怎么做 可以实现精益生产和智能制造?

生产设备在制造过程中会产生多种类型的数据&#xff0c;这些数据对于优化生产流程、提高效率、降低成本和预防性维护等方面至关重要。需要对这些数据进行有效的采集和管理&#xff0c;以实现对生产设备数据管控。 一、生产设备数据类型包括&#xff1a; 设备运行状态数据&…

C++八股(面试题、手撕题)自用版

目录 面试题&#xff1a; 1. define inline 在编译的哪个阶段 2. const static 3. 子函数返回结构体有什么问题&#xff0c;返回对象调用了哪些函数 4. volatile关键字 5. 编译器基本原理 6. 预处理、编译、汇编、链接以及他们在操作系统上如何运作的 7. 数组和指针&a…

第十一届蓝桥杯大赛软件类决赛 Java 研究生组

文章目录 发现宝藏【考生须知】试题 A: 合数个数试题 B: 含 2 天数试题 C 阶乘约数试题 D: 本质上升序列试题 E: 迨尺天涯试题 F 循环小数试题 G: 蓝肽子序列试题 H 出租车试题 I: 答疑试题 J: 蓝跳跳 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&a…

【高阶数据结构(三)】图的遍历最小生成树问题

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:高阶数据结构专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Go语言知识   &#x1f51d;&#x1f51d; 高阶数据结构 1. 前言2. 图的遍…