[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.rhkb.cn/news/428734.html

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

相关文章

LeetCode[中等] 215. 数组中的第 K 个最大元素

给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 思路&#xff1a;基于快排改进的快速…

【云原生安全篇】一文掌握Harbor集成Trivy应用实践

【云原生安全篇】一文掌握Harbor集成Trivy应用实践 目录 1 概念 1.1 什么是 Harbor 和 Trivy&#xff1f; 1.1.1 Harbor 1.1.2 Trivy 1.2 Harbor 与 Trivy 的关系 Trivy 在 Harbor 中的作用&#xff1a; 1.3 镜像扫描工作流程 2 实战案例&#xff1a;在Harbor 配置 Trivy …

初识模版!!

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

Windows上创建批处理.bat文件并且注册为开机自启(Python-web微服务)

1. winodws桌面点击创建文本文件 &#xff08;文件名称.txt&#xff09; 2. 将如下代码写入txt文件中 echo off if "%1""h" goto begin start mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h"…

(七)使用SoapUI工具调用WebAPI

1.调用一个无参数的GET请求 [HttpGet(Name "GetWeatherForecast")]public IEnumerable<WeatherForecast> Get(){return Enumerable.Range(1, 5).Select(index > new WeatherForecast{Date DateTime.Now.AddDays(index),TemperatureC Random.Shared.Next(…

科研绘图系列:R语言箱线图(boxplot)

文章目录 介绍加载R包导入数据画图1画图2合并图形系统信息介绍 箱线图展示不同分组的数据分布差异。 加载R包 library(here) library("tidyverse") library("ggpubr") library("scales")

【工具】Windows|两款开源桌面窗口管理小工具Deskpins和WindowTop

总结 Deskpins 功能单一&#xff0c;拖到窗口上窗口就可以置顶并且标记钉子标签&#xff0c;大小 104 KB&#xff0c;开源位置&#xff1a;https://github.com/thewhitegrizzli/DeskPins/releases WindowTop 功能完善全面强大&#xff0c;包括透明度、置顶、选区置顶等一系列功…

如何查看Android设备的dpi

adb shell getprop ro.sf.lcd_density adb shell cat /system/build.prop > build_prop.txt shell cat system/build.prop 结果&#xff1a;参考&#xff1a; 如何查看Android设备的dpi_安卓 查看手机dpi-CSDN博客

ElementUI 用span-method实现循环el-table组件的合并行功能

需要把指定列的相同数据合并起来&#xff08;项目中用的是updateTime&#xff09; 后端返回的数据格式&#xff1a; html&#xff1a; <el-tab-pane label"执行记录概览" name"fourth" v-loading"loading"><el-timeline v-if"re…

windows安装Anaconda教程

一、简介 Anaconda 是一个开源的 Python 和 R 语言的分发平台&#xff0c;专为科学计算和数据分析设计。它包含了包管理器 Conda&#xff0c;可以方便地安装和管理库、环境和依赖项。此外&#xff0c;Anaconda 还附带了许多数据科学工具和库&#xff0c;如 Jupyter Notebook 和…

Ubuntu截图工具flameshot

最近在使用香橙派做一些东西&#xff0c;有些内容需要截图记录&#xff0c;这里记录一下截图工具的安装和使用过程&#xff0c;方便以后查阅。 Ubuntu截图工具flameshot flameshot 简介flameshot 安装flameshot 相关命令 flameshot 简介 linux系统里面最好用的截屏工具支持图形…

el-table的树形结构结合多选框使用,实现单选父子联动,全选,反选功能

<template><div><el-table:data"tableData":row-key"rowKey":default-expand-all"defaultExpandAll":tree-props"treeProps"><!-- 开启树形多选 --><el-table-column v-if"showSelection" width…

[Matplotlib教程] 02 折线图、柱状图、散点图教程

基于MFCC和CNN的语音情感识别 2 折线图、柱状图、散点图2.1 折线图2.1.1 简单折线图2.1.1 线形和Markevery2.1.2 带误差棒的折线图2.1.3 区间填充和透明度 2.2 柱状图2.2.1 分组柱状图2.2.2 堆叠柱状图2.2.3 横向柱状图 2.3 散点图 我们的网站是 菜码编程&#xff0c;我们的q群…

Altium Designer(AD)百度云下载与安装(附安装步骤)

在我们日常使用当中&#xff0c;Altium designer常常也被简称为AD&#xff0c;是一款一体化的电子产品开发系统软件&#xff0c;主要运行在Windows操作系统上。 我们通过Altium designer把原理图设计、电路仿真、PCB绘制编辑、拓扑逻辑自动布线、信号完整性分析和设计输出等技…

毕业设计选题:基于ssm+vue+uniapp的捷邻小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

多层感知机paddle

多层感知机——paddle部分 本文部分为paddle框架以及部分理论分析&#xff0c;torch框架对应代码可见多层感知机 import paddle print("paddle version:",paddle.__version__)paddle version: 2.6.1多层感知机&#xff08;MLP&#xff0c;也称为神经网络&#xff0…

web基础—dvwa靶场(十)XSS

XSS(DOM) 跨站点脚本&#xff08;XSS&#xff09;攻击是一种注入攻击&#xff0c;恶意脚本会被注入到可信的网站中。当攻击者使用 web 应用程序将恶意代码&#xff08;通常以浏览器端脚本的形式&#xff09;发送给其他最终用户时&#xff0c;就会发生 XSS 攻击。允许这些攻击成…

【3D打印】使用simplify 3D切片更改Gcode手动断电续打、掉电、未打完继续打印、补救

一、问题描述 有些时候会遇到3D打印机没料但机器还在继续打、掉电重启后未正常恢复打印、挤出机端没有料但断料检测未触发等情况。我们又不想打印放弃&#xff0c;但又想继续之前的进度打印。 这时候我们需要更改3D打印文件的Gcode参数来进行继续打印。 至于什么是Gcode&…

SQL - 基础语法

SQL作为一种操作命令集, 以其丰富的功能受到业内人士的广泛欢迎, 成为提升数据库操作效率的保障。SQL Server数据库的应用&#xff0c;能够有效提升数据请求与返回的速度&#xff0c;有效应对复杂任务的处理&#xff0c;是提升工作效率的关键。 由于SQL Servers数据库管理系统…

【秋招笔试-支持在线评测】8.28华为秋招(已改编)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 华为专栏传送🚪 -> 🧷华为春秋招笔试 目前今年秋招的笔…