进程相关介绍(一)

news2024/9/29 3:33:28

目录

  进程标识符

  查看进程的标识符

  ps axj | head -1&& ps axj | grep 程序名

  ls /proc/进程标识符

  获得进程标识符

  getpid()函数

  getppid()函数

  创建一个子进程

  fork函数解析

  fork函数返回子进程的pid给父进程的原因

  fork函数有两个返回值的原因

  一个进程实质上就是一个被执行的程序。操作系统会将这个程序使用PCB结构体保管起来,之后通过链表的形式将各个进程的PCB结构体和其相对应的代码数据管理起来。

  在Linux当中PCB结构体有很多种,最主要的是task_ struct。在task_ struct结构体当中存储着各种进程的的属性。例如:标示符,状态,优先级等等。为了更加清楚的认识进程相关的知识,我们将会依次介绍其中的几个主要的属性以及集中最主要的进程。

  进程标识符

  查看进程的标识符

  在我们使用计算机的时候总会打开很多进程。比如我们会在使用浏览器写博客的同时,打开Linux软件执行Linux指令,还有可能打开画图,画思维导图便于我们理解。这几个窗口就是很多不同的进程。

  同样的Linux操作系统当中也是一样的。我们之前说过所有的可执行程序都是一个进程,所以我们编写的代码也是一样。我们可以通过特定的指令查看我们的进程编号。

  ps axj | head -1&& ps axj | grep 程序名

  其中ps指令就是我们最经常使用的查看程序进程号的命令,axj表示的是参数,我们在后面会详细介绍相关参数的含义,我们在这里直接使用即可。head -1表示显示所有进程的属性名,可以被省略。

  主要发挥查找进程的作用的是后面的ps axj | grep 程序名。ps会显示所有的进程相关的内容,之后通过grep过滤符可以查找特定进程的相关信息,忽略其他进程等繁

杂的内容。

  我们输入上述的命令之后会发现我们进程的表示符为12218。

  ls /proc/进程标识符

  在找到进程标识符之后我们可以通过ls指令进行查看文件夹当中进程具体的内容,也就是task_ struct当中所包含的进程的的属性和数据。执行指令效果如下:

  其中cwd当中所示的就是我们数据所保存的位置,也就是我们编写的代码的位置。

  获得进程标识符

  获得进程标识符的方法有很多种,使用Linux指令查看进程标识符只是其中的方式之一。我们还可以通过对程序代码的编写,也就是调用系统函数获取进程的标识符。

  getpid()函数

  我们可以使用getpid函数获取我们该进程的标识符。关于getpid函数的详细介绍我们可以通过man手册进行查看。

  我们会发现函数的函数原型为:pid_t getpid(void) 其中的pid_t实质上是我们操作系统自己重命名生成的一个数据类型。它本身也就是一个int类型的数据。也就是说我们在调用getpid函数的时候会有一个整数也就是我们该程序的标识符编号。

  程序运行的效果:

  我们会发现获得的程序的进程标识符都是相同的。

  getppid()函数

  我们可以通过getppid函数获得父进程的标识符。父进程就是创建子进程的程序。我们所有的程序都是通过操作系统所运行的,当我们有很多用户的时候为了方便操作系统区分不同的用户,所以就会创建很多不同的进程。我们在该进程当中继续执行特定的指令或者编写代码,生成进程。所以新生成的进程就是子进程,原本就存在的进程就叫做父进程。

  同样的我们可以通过函数获得父进程的标识符。获得父进程的标识符的函数就是我们上面所展示的getppid。返回值同样是pid_t(一个整形值)。我们通过代码进行测试如下:

  程序运行的结果如下:

  创建一个子进程

  那么除了运行我们的程序代码还有其他方法创建一个进程吗?答案是有,我们同样可以通过系统调用函数fork函数创建一个子进程。

  我们先通过函数原型进行认识fork函数。

  在使用fork函数的时候我们需要添加<unistd.h>的头文件,我们可以看出fork函数的作用是创建一个子进程。之后我们继续阅读函数的返回值:

  如果我们成功创建一个子进程的话,我们创建的子进程就会返回孩子进程的标识符,返回0给我们的孩子进程。如果失败就会返回-1给我们的父进程。

  看到这里我们可能会很奇怪,我们之前学习的不是函数只能有一个返回值吗?为什么这里会有两个呢?要想知道使用fork函数会有两个返回值的原因,我们可以先尝试使用fork函数创建一个进程试一试。

  

  运行结果如下:

  我们会发现原本应该运行打印的hello world在这里打印了两遍。这就是我们fork函数创建一个进程之后发挥的作用。我们两个进程在执行代码的时候会共同执行公共部分的代码,也就是说子进程执行打印了一遍hello world父进程也执行了一遍hello world。

  fork函数解析

  fork函数的返回值有两个,一个是针对我们的子进程的,一个是针对我们的父进程的。所以我们想要辨别子进程和父进程就可以通过使用变量进行接收fork函数的返回值进行判断。我们可以书写以下的代码:

  运行结果:

  我们可以发现执行代码之后确实产生了两个进程,运行结果和我们编写的代码相同,但是又有一些不同。只有在if判断里面的代码会出现一遍,在公共部分的代码出现了两边。运行的效果也和我们的预期相同,我们会先运行父进程当中的代码,之后再运行子进程当中的代码。(其中父进程的父进程为bash进程)

  fork函数返回子进程的pid给父进程的原因

  我们重新进行分析:为什么fork函数的两个返回值分别是给父进程返回子进程的pid,给子进程返回0呢?

  这是因为我们每一个进程都可以拥有多个子进程,但是我们的子进程却只能拥有一个父进程。跟树形结构很类似。所以我们子进程对于自己并不需要获得标识符信息,但是为了方便我们的父进程进行进程方面的管理。我们才需要向父进程返回子进程的pid。

  fork函数有两个返回值的原因

  那么第二个问题来了:正常的函数都是有一个返回值,那么我们的fork函数是怎么做到有两个返回值的呢?

  我们之前说到过操作系统在管理进程实质上是操作系统对PCB结构体以及代码相关的数据进行管理。所以我们在创建一个新的进程的时候就需要创建一个新的PCB结构体和相关的数据,并将PCB结构体链入到我们的结构体构成的链表当中。

  但是我们存储两份数据对我们操作系统当中的空间很不友好,会大量的浪费我们的内存空间。因此我们就想能不能存储一份数据。因为我们创建的子进程和父进程共同执行相同的部分,所以我们只需要将新旧进程当中指向同一份数据代码即可。我们可以使用ls代码进行验证我们的猜想:

  其中24563为我们父进程的进程标识符,24564为我们子进程的进程标识符。我们发现其中的cwd都是指向同一个目录地址。

  但是我们这样使用同一份数据真的是合理的吗?假如我们修改一个子进程当中的变量的值,是不是父进程当中的变量的值也对应进行了改变呢?就好比我们给两个QQ好友发消息,给一个人发的消息另一个人也可以看到,这样肯定不合理。

  所以我们就采用了写时拷贝的特点,当我们的程序需要对数据进行修改的时候,就将这个数据进行备份,将我们修改出来的数据放到我们备份好的变量当中。

  而我们的函数在返回的时候也是一种进行数据写入的操作,所以就需要进行数据的拷贝,也正是因此fork函数会有两个返回值。

  第三个问题是为什么我们一个变量当中能够存储两个数据。这个问题我们需要在之后学习过地址空间之后再向大家进行详细的介绍。

  我们使用fork函数创建出来的子进程和父进程的运行顺序由我们的调度器进行决定,没有具体的先后运行的顺序。

  因为我们父进程也有一个父进程,也就是我们的bash进程。因此我们很容易想到bash进程创建“父进程”的原理其实和我们父进程创建子进程的原理是相同的。

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

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

相关文章

【每日一记】OSPF中Hello报文详讲

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大二在校生&#xff0c;喜欢编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;小新爱学习. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc…

SpringBoot 实现EMQ设备的上下线告警

前言 上下线通知 我遇到了一个难题&#xff0c;即在使用EMQ X 4.4.10的开源版本时&#xff0c;我需要实现设备的上下线状态监控&#xff0c;但该4.4.10开源版本并未内置设备上下线提醒模块&#xff0c;只有企业版才内置了该模块。这为我带来了一些技术上的难题&#xff0c;迫…

远程办公软件的未来趋势:预测2023年及以后的发展方向

随着科技的迅速发展&#xff0c;远程办公已经成为现代工作方式的重要组成部分。远程办公软件在过去几年中取得了巨大的进步&#xff0c;并且在全球范围内被广泛使用。本文将探讨远程办公软件在2023年及以后可能的发展方向&#xff0c;包括增强的协作功能、智能化的辅助工具、改…

坦克 400 Hi4-T:用产品诠释越野新能源

9 月 25 日&#xff0c;坦克 400 Hi4-T 正式上市&#xff0c;新车共推出两款车型配置&#xff0c;售价区间 27.98-28.98 万元。同时&#xff0c;坦克 400 Hi4-T 将上市及即交付。 权益方面&#xff0c;坦克 400 Hi4-T 共有七重好礼&#xff1a; 质保无忧&#xff1a;整车 5 年…

02 认识Verilog HDL

02 认识Verilog HDL ‍ 对于Verilog的语言的学习&#xff0c;我认为没必要一开始就从头到尾认真的学习这个语言&#xff0c;把这个语言所有细节都搞清楚也不现实&#xff0c;我们能够看懂当前FPGA的代码的程度就可以了&#xff0c;随着学习FPGA深度的增加&#xff0c;再不断的…

Autosar诊断实战系列24-0x2E服务代码级分析及ECU-Pending期间的处理

本文框架 前言1. UDS-0x2E服务逻辑整理2. Pending期间ECU的处理3. 相关工程问题思考前言 开始本篇讲述前,先抛出几个问题,UDS 2E服务在执行过程中进行了哪些操作?在2E写期间由于要操作NvM,会执行时间较长导致ECU先回复NRC 0x78,这期间ECU在进行哪些处理?ECU是如何判断2E…

单目标应用:蚁群算法(Ant Colony Optimization,ACO)求解微电网优化MATLAB

一、微网系统运行优化模型 微电网优化模型介绍&#xff1a; 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、蚁群算法ACO 蚁群算法&#xff08;Ant Clony Optimization&#xff0c; ACO&#xff09;由意大利学者Colorni A., Dorigo M. 等于1991年提出&#xff0c…

开啥玩笑?一个SSD硬盘可以使用100多年?MTBF正解

在之前文章中&#xff0c;有一个参数“平均无故障时间”&#xff0c;对应的参数是MTBF&#xff0c;比如这个盘MTBF150万小时。 小编发现有一些朋友对这个参数还有误解。大家看到这个参数误认为盘可以使用150万小时都没有发生故障。如果真的是这样&#xff0c;那么这盘的质量简直…

基于springboot实现家具销售电商平台管理系统项目【项目源码+论文说明】

基于springboot实现家具销售电商平台管理系统演示 摘要 社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。网络计算机的交易方式逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。互联网具有便利性&#xff0c;速度快&#xff0c;效率高&am…

【OSPF宣告——network命令与多区域配置实验案例】

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大二在校生&#xff0c;喜欢编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;小新爱学习. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc…

ChatGLM2-6B微调实践-P-Tuning方案

ChatGLM2-6B微调实践 环境准备安装部署1、安装 Anaconda2、安装CUDA3、安装PyTorch4、安装 ChatGLM2-6B 微调实践1、准备数据集2、安装python依赖3、微调并训练新模型4、微调后模型的推理与评估5、验证与评估微调后的模型6、微调模型优化7、P-Tuning微调灾难性遗忘问题 微调过程…

vulnhub_Inferno靶机渗透测试

Inferno靶机 靶机地址&#xff1a;https://www.vulnhub.com/entry/inferno-11,603/ 文章目录 Inferno靶机信息收集web渗透获取权限横向移动权限提升靶机总结 信息收集 1.通过nmap扫描得到靶机开放22和80端口&#xff0c;看来是主web端渗透了 使用dirsearch目录扫描没得到结果…

【Mybatis】动态 SQL

动态 SQL \<if>标签\<trim>标签\<where>标签\<set>标签\<foreach>标签 动态 sql 是 Mybatis 的强⼤特性之⼀&#xff0c;能够完成不同条件下不同的 sql 拼接。 <if>标签 前端用户输入时有些选项是非必填的, 那么此时传到后端的参数是不确…

面试总结(mysql定精度/oom排查/spring三级缓存/stream流)

Mysql数据类型上的一个把握 1、MySQL Decimal为什么不会丢失精度 DECIMAL的存储方式和其他数据类型都不同&#xff0c;它是以字符串形式存储的。假设一个字段为DECIMAL(3,0)&#xff0c;当我们存入100时&#xff0c;实际上存入的1、0、0这三个字符拼接而成的字符串的二进制值&…

Linux 基本指令(下)

时间相关的指令 date显示 date 指定格式显示时间&#xff1a; date %Y:%m:%d date 用法&#xff1a;date [OPTION]... [FORMAT] 1.在显示方面&#xff0c;使用者可以设定欲显示的格式&#xff0c;格式设定为一个加号后接数个标记&#xff0c;其中常用的标记列表如下 %…

1010hw

using namespace std; class Per {friend const Per operator-(const Per &L,const Per &R);friend bool operator<(const Per &L,const Per &R);int a;int b; public://有参构造Per(int a,int b):a(a),b(b){}//无参构造Per(){}//运算符重载const Per opera…

MyBatis注解开发实现学生管理页面(分页pagehelper,多条件搜索,查看课程信息)

pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …

【论文阅读】面向抽取和理解基于Transformer的自动作文评分模型的隐式评价标准(实验结果部分)

方法 结果 在这一部分&#xff0c;我们展示对于每个模型比较的聚合的统计分析当涉及到计算特征和独立的特征组&#xff08;表格1&#xff09;&#xff0c;抽取功能组和对齐重要功能组&#xff08;表格2&#xff09;&#xff0c;并且最后&#xff0c;我们提供从模型比较&#x…

【前端工程化】配置React+ts企业级代码规范及样式格式和git提交规范

目录 前言 代码规范技术栈 创建react18vite2ts项目 editorconfig统一编辑器配置 prettier自动格式化代码 eslintlint-staged检测代码 使用tsc检测类型和报错 代码提交时使用husky检测代码语法规范 代码提交时使用husky检测commit备注规范 配置commitizen方便添加commi…

VMware centos7虚拟机修改静态IP

一、修改网络适配器 1、打开 2、使用管理员权限修改 3、按照图中步骤修改为 4、设置网关为10.0.0.2后保存即可 二、修改配置文件 1、输入下面代码进入修改&#xff08;网卡这里网卡名字为ens33&#xff0c;可使用ifcfig或ip a查看&#xff09; vi /etc/sysconfig/netwo…