[Linux] Linux进程PCB内部信息的深入理解

标题:[Linux] Linux进程PCB内部信息的深入理解

个人主页:@水墨不写bug

(图片来自网络)

目录

一.查看进程

二.认识并了解进程的关键信息

I,PID/PPID

 II,exe

III,cwd

 三、fork()创建进程


正文开始: 

一.查看进程

        进程的信息可以通过 /proc 系统文件夹查看。


proc目录介绍:

        /proc这个目录下的文件数据是内存级别的数据,操作系统启动,操作系统会遍历进程的PCB,最终形成proc目录下的文件数据。

        这些数据不是磁盘级别,而是内存级别的。

        proc是实时更新的,运行一个进程,这个进程的PID就会出现在proc目录中。


        如:要获取PID为1的进程信息,你需要查看 /proc/1 这个文件夹。

我们可以使用ls、top、ps等命令查看当前正在运行的进程:

        ls:

命令:ls /proc

        top:

命令:top

        ps:

命令:ps axj

        特别的,对于ps axj命令,我们如果知道进程的文件名,可以通过管道来获取关键名,进行更高效的搜索展示:

比如我们提前运行起来名字为mytest的程序,那么可以使用管道结合grep:
ps axj | grep mytest

二.认识并了解进程的关键信息

I,PID/PPID

        进程id(PID):每一个进程都有自己的独特的标识自己的ID。

        就像人的身份证,学生的学号一样,一个进程创建的时候会有自己的PID。进程的PID是一个大整数,一旦获取,在进程结束之前都是不变的。同一个可执行程序,在不同时间运行,PID不同,并且后面的PID较大。

        父进程id(PPID):相对父辈的进程的PID;


        我们可以通过 头文件<unistd.h> 的 getpid()  和 getppid() 函数来得到进程的PIDPPID:

#include<unistd.h>
#include<sys/types.h>
using namespace std;int main()
{while(1){int i = 1;while(i != 1e9){++i;}cout<<"-----------"<<endl;                                       cout<<"my pid:"<<getpid()<<endl;cout<<"my ppid:"<<getppid()<<endl;}return 0;
}

 上面的进程运行起来之后:

        通过分析,当前运行进程的pid=23654,没什么问题。

        为了方便演示进程,我们故意写了一个死循环;如果想要结束这个进程,我们可以采取如下的方式: 

        杀进程:ctrl + C 或者 kill -9 + 进程PID

        当我们杀掉进程后,再次运行起来,发现pid=变大了,没问题。 但是问题是两次运行的ppid是相同的!通过查询我们发现 ppid=23714的进程正是Bash(命令行解释器)

        在命令行中,执行命令/执行程序的,本质是Bash的进程创建子进程,由子进程执行我们的代码。(Bash是Linux下常用的 shell 外壳)


 II,exe

        exe链接到可执行程序的位置

        进程在运行起来时,exe记录了当前这个运行的程序的位置;是当前程序的固有属性,不变的。


III,cwd

        cwd(current work directory)当前工作目录

        cwd记录了当前工作目录是我们进行操作的目录,是可指定的。一般而言,我们的工作目录就是当前所处的目录。

        这也就解释了在C语言阶段时,当我们在源码中使用fopen时,为什么默认创建的文件的位置是当前文件夹因为cwd会存储当前程序运行的目录位置,并自动拼接在我们创建的文件名称之前,于是创建的文件默认是在当前路径。如果想要指定路径,则需要写绝对路径。


 三、fork()创建进程

        父进程的概念:在Linux中, 程序启动之后,新建任何进程的时候,都是由自己的父进程创建的。

        父进程id(PPID):相对父辈的进程的PID;

        父子进程的关系满足树状结构:一个父进程可以有多个子进程;而一个子进程只有唯一的父进程。

fork函数的man手册解释

         

        通过查看man手册,我们发现fork函数的解释是十分费解的。

         想要理解fork()函数,仅仅看解释还不够,需要理解下面这一段代码并解释清楚运行情况才可以:

        当我们运行起来这一个程序,我们会发现这样的现象:

        我们会发现if和else的语句同时被执行了,一般而言这是不可能发生的事情!

        原因在于,在fork创建一个子进程之后,这个进程的执行分支就不再是一个执行分支了,而是两个执行分支。一个分支的id满足if的条件,而另一个分支的id满足else的条件,所以整体上表现出if和else同时被执行的错觉。

        在前面的讲解中,我们知道:

进程  = 内核数据结构 + 代码和数据

         当我们在进程A中创建一个进程a1时,a1可以拥有内核数据结构,但是a1到哪里去加载代码和数据呢?

        于是,进程A创建的子进程a1就加载了进程A的代码和数据,但是两份代码和数据是相互独立的。也就是说,进程A中的全局变量glo = 0,在fork之后,子进程修改glo,修改的是自己的glo,而不是进程A的glo,进程A的glo仍=0;

         fork:fork创建子进程之后,父子进程的代码共享。但是数据各自独自私有一份,数据独立。

 为什么?

        进程具有很强的独立性,多个进程之间,运行时,互不影响。包括父子进程之间。

        (就比如你在VS上写一个代码,编译出的可执行程序运行时出现野指针,崩了,但是VS不会挂。这就是因为VS进程你写的进程是两个进程,进程之间具有很强的独立性

fork总结:

        1.id的返回值,给父进程(pid),子进程(0);

        2.fork会有两个返回值--为什么?

因为子进程加载了父进程的代码和数据,自己单独返回了id给自己的那一份数据赋值。

        3.接收fork的返回值只有一个变量,怎么会有不同的值?

                本质上与2是相同的问题,此外也是为了保持进程之间的独立性。

                怎么做到的?

                        --进程地址空间

        fork之后哪一个进程先运行?

由操作系统的调度器自主决定。


完·~

未经作者同意禁止转载

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

设置文件夹用VSCODE右键打开,自己修改注册表不管用,该怎么办

设置文件夹用VSCODE右键打开&#xff0c;自己修改注册表不管用&#xff1b;试了好几次&#xff0c;自己修改注册表的方法不管用。所幸直接下个新版本&#xff0c;覆盖安装&#xff0c;把这两个选项勾上就可以了。

linux-基础知识4

网络连接性测试 ping ping可以用来测试本机与目标主机的连通速度网络稳定性 ping -c 5 -s 1024 目标主机ip地址 -c 表示ping包的个数,linux如果缺省-c会一直ping下去&#xff0c;windows平台的选项是-n -s指定ping发送数据的字节数默认是84字节。windows的是-l 没有问题时会之…

2023国赛C题 蔬菜类商品的自动定价与补货决策(上)

2023国赛C题 蔬菜类商品的自动定价与补货决策&#xff08;上&#xff09; 符号说明&#xff1a; 问题1 问题1主要的代码和思路在上一篇文章“数学建模实战块速入门”中已经进行了较为详细的展示&#xff0c;在问题一种要求我们从蔬菜单品和品类两个维度去分析各自之间的关系。…

2024年中国研究生数学建模竞赛C题——解题思路

2024年中国研究生数学建模竞赛C题——解题思路 数据驱动下磁性元件的磁芯损耗建模——解决思路 二、问题描述 为解决磁性元件磁芯材料损耗精确计算问题&#xff0c;通过实测磁性元件在给定工况&#xff08;不同温度、频率、磁通密度&#xff09;下磁芯材料损耗的数据&#xf…

学习笔记——MMSR 自适应多模态融合的序列推荐

Adaptive Multi-Modalities Fusion in Sequential Recommendation Systems 前几天当我在阅读这篇论文的时候&#xff0c;在网上找到的相关资料很少&#xff0c;所以当时我读这篇论文的时候特别痛苦&#xff0c;精读了两天半.....所以现在我将自己学习笔记分享出来&#xff0c;…

服务器安全,你必须知道的六个知识点

服务器安全 如今没有什么是安全的。各种系统安全漏洞的数量呈爆炸式增长。令人担忧的主要原因之一是服务器安全性。 接下来&#xff0c;就如何提升服务器安全&#xff0c;写几点见解。 虽然很多企业在服务器的安全性方面做了足够多&#xff0c;但是&#xff0c;黑客仍然能够…

Python数据分析与可视化(Python绘图详解)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Qt圆角窗口

Qt圆角窗口 问题&#xff1a;自己重写了一个窗口&#xff0c;发现用qss设置圆角了&#xff0c;但是都不生效&#xff0c;不过子窗口圆角都生效了。 无边框移动窗口 bool eventFilter(QObject *watched, QEvent *evt) {static QPoint mousePoint;static bool mousePressed f…

群晖Docker如何修改配置文件(ContainerManager)

群晖Docker与其他linux操作系统的docker启动方式存在差异,默认的Docker配置文件位置也不一样。所以本章教程,主要介绍如何找到群晖Docker下的默认配置文件。 一、登录SSH 为了方便操作,需要开启SSH,并通过SSH链接到群晖NAS主机。登录之后,切换到root用户 sudo -i二、编辑配…

车载测试项目实操学习:CAN通信测试、UDS诊断测试、自动化测试、功能安全测试、CAN一致性测试、HIL测试:9-20

FOTA模块中OTA的知识点&#xff1a;1.测试过程中发现哪几类问题&#xff1f; 可能就是一个单键的ecu&#xff0c;比如升了一个门的ecu&#xff0c;他的升了之后就关不上&#xff0c;还有就是升级组合ecu的时候&#xff0c;c屏上不显示进度条。 2.在做ota测试的过程中&#xff…

企业文档管理系统哪个好?2024年热门的10款文档管理系统软件推荐

在信息化时代&#xff0c;企业每天都会生成海量的文档、数据和资料。 如何有效管理这些文档&#xff0c;确保信息安全、版本控制和协同办公顺畅&#xff0c;是每个企业都必须面对的挑战。 2024年&#xff0c;随着技术的不断进步&#xff0c;市场上涌现出了众多优秀的文档管理…

Selenium自动化测试环境搭建详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 本主要介绍以Java为基础&#xff0c;搭建Selenium自动化测试环境&#xff0c;并且实现代码编写的过程。 1、Selenium介绍 Selenium 1.0 包含 core、IDE、RC、gri…

C++进阶 set和map讲解

set 和 map set 和 multiset set set 类的介绍 set 是基于红黑树实现的有序容器。它的插入、删除、查找操作的时间复杂度均为 O(log n)。遍历时&#xff0c;set 的迭代器按照中序遍历&#xff0c;因此它总是以升序排列元素。 set 的声明如下&#xff0c;T 表示 set 的关键字类…

Kubernetes集群部署(kubernetes)

三台主机恢复到docker快照状态&#xff1b; 检查驱动器类型为sytemd&#xff1b; 设置各个节点的主机名&#xff1b; 然后同步会话&#xff0c;修改hosts文件&#xff1b; 在k8s运行过程中不建议使用交换分区&#xff1b; 关闭交换分区&#xff1b; 但是这种方法是临时性的&am…

JavaSE--零基础的开始笔记02:基础语法--标识符,关键字,变量

一.标识符 Java 语言中&#xff0c;对各种变量、方法和类等要素命名时使用的字符序列称为标识符。 Java 标识符有如下命名规则&#xff1a; 标识符由字母、下划线“_” 、美元符“$”或数字组成。 标识符应以字母、下划线 、美元符开头。 Java 标识符大小写敏感&#xff0c…

【Linux笔记】虚拟机内Linux内容复制到宿主机的Window文件夹(文件)中

一、共享文件夹 I、Windows宿主机上创建一个文件夹 目录&#xff1a;D:\Centos_iso\shared_files II、在VMware中设置共享文件夹 1、打开VMware Workstation 2、选择需要设置的Linux虚拟机&#xff0c;点击“编辑虚拟机设置”。 3、在“选项”标签页中&#xff0c;选择“共…

初识模版!!

初识模版 1.泛型编程1.1 如何实现一个交换函数呢&#xff08;使得所有数据都可以交换&#xff09;&#xff1f;1.2 那可以不可以让编译器根据不同的类型利用该模子来生成代码呢&#xff1f; 2.模版类型2.1 模版概念2.2 函数模版的原理2.3 函数模板的实例化2.4 模板参数的匹配原…

【C++初阶】探索STL之——String类的模拟实现

【C初阶】String类的模拟实现 1.string类2.string类的构造和赋值实现3.类的析构实现4.类的iterator5.类的修改&#xff08;Modify&#xff09;实现6.类的capacity实现7.类access的实现8.类relational operators的实现9.类find、insert、erase的实现10.operator>>和operat…

官方力荐:LDR6020 PD技术,让Type-C接口充放OTG不再是梦!

PD&#xff08;Power Delivery&#xff09;芯片赋能Type-C接口&#xff1a;解锁充电与数据传输的双重魔法 一、PD芯片的科技内核 高速充电与智能数据传输&#xff1a; PD芯片深谙USB Power Delivery规范&#xff0c;支持高功率传输协议&#xff0c;实现快速充电的同时&#x…

数据中台过时了?为什么现在都在说数据飞轮

数据中台作为一种集中式的数据管理与服务平台&#xff0c;在解决企业数据管理困境中发挥着重要作用&#xff0c;如数据孤岛、数据标准化、数据共享与复用等问题。通过统一的数据采集、处理、存储和服务&#xff0c;数据中台构建了一个全局性的数据枢纽&#xff0c;满足各业务部…