Linux进程控制(一)

        前言:Linux进程控制是指在Linux操作系统中,对进程的创建、运行、管理和终止等方面进行控制的一系列机制和技术。Linux作为一个多任务操作系统,能够同时运行多个进程任务的执行,继前面我们对Linux进程创建的学习之后,今天我们来深入了解Linux的进程控制。

目录

1.进程创建&fork函数

2.写时拷贝

操作系统如何辨别进程要采取写时拷贝?

既然需要修改,为什么还要进行拷贝操作?

3.进程终止

进程正常退出

错误码vs退出码

C语言中的退出码

C语言中的错误码

进程异常终止

进程退出总结


1.进程创建&fork函数

        fork函数我们在很早之前就已经提到,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。进程调用fork,当控制转移到Linux内核中的fork代码后,内核做:

分配新的内存块和内核数据结构给子进程

将父进程部分数据结构内容拷贝至子进程

添加子进程到系统进程列表当中

fork返回,开始调度器调度

      fork之前父进程独立执行,fork之后,父子两个执行流分别执行。注意,fork之后,谁先执行完全由调度器决定,并不是一定要子进程或者父进程先执行。

2.写时拷贝

      通常,fork函数之后,父子代码共享,父子在不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本

操作系统如何辨别进程要采取写时拷贝?

       当父子进程任意一方想要进行修改的时候,操作系统必然需要为这个进程重新申请物理内存空间,然后将原来的数据拷贝一份到新申请的空间中,并且还需要修改页表的映射关系,所以,操作系统需要对我们想要写入父进程或者子进程的数据的行为进行识别,以采取相应的措施。

       结合上面的写时拷贝示意图,当用户需要对父进程或者子进程进行写入操作时,此时,由于父子进程的页表项的虚拟地址都是只读状态,用户的写入操作会和页表项的访问权限冲突,此时操作系统就可以识别这个行为,并将该行为识别为需要进行写时拷贝的信号......

等一下,你这说的云里雾里的,能不能说明白点?

那,我们来整一个图解释一下,这样应该更好理解了,

既然需要修改,为什么还要进行拷贝操作?

       当我们需要写入的时候,不论父子进程,最终的目的都是需要修改该进程中的值,但是,为什么一定要将原进程的数据拷贝一份到需要修改的进程的新的物理内存处呢?按我们的想法,直接开辟一份大小和原进程一模一样的数据块,直接等待数据写入不就行了?为何要多此一举呢?

      事实上,进行写时拷贝的内存往往不止一个变量,而是一个数据块,里面往往可能包含多个数据成员或者一个数据整体,比如结构体,链表等,一般情况下,我们不会修改全部的数据,只是修改一小部分,在写入之前拷贝,可以尽可能的保存原始数据,无需进行全部写入的操作。

3.进程终止

进程常见的退出场景一般有如下三种:

代码运行完毕,结果正确

代码运行完毕,结果不正确

代码异常终止

        我们需要将其分为两个方面进行讨论,我们将前两种情况,也就是代码能够正常退出归为一种,代码异常终止归为一种。

进程正常退出

错误码vs退出码

       我们在写main函数时,最后都要返回一个0,一般的,我们都能了解到main函数的返回值为0,表示成功,非零表示的是失败。我们知道,一个进程,最终运行成功了(返回了0),我们一般不会在对该进程的执行情况做过多的探究,但是,一旦进程最终运行异常退出了(返回类非0值),我们就想想方设法的搞清楚这个进程为什么会异常退出,是哪里的原因导致异常退出,这也就导致了进程异常退出会被分为多种情况类型,每种情况类型的异常状态都不同,借此来反应异常的原因。我们main函数的返回值,都叫做退出码。退出码,就是一个进程退出时返回的退出结果。错误码的范围就会更小一些,是用来衡量一个函数或者是一个系统调用一个函数的调用情况,如果失败了,则会返回函数或者进程失败的具体原因。

    我们可以通过  echo $? 命令来查看最近的一个子进程的退出码。

C语言中的退出码

     C语言中内置了一些退出码,用不同的数字表示不同的退出码的解释,其包含在头文件string.h里面的strerror函数中,我们可以试着将其打印出来:

C语言中的错误码

      C语言中有一个内置的全局变量errno,该变量专门用来保存函数或者进程出错返回的错误码,这个错误码,和我们的退出码是相同的,只是用专门的变量来保存,当然也可以用strerrno函数来打印出这个错误。但是需要注意,errno的使用,需要包含errno.h头文件。由于和退出码相似,这里就不在演示。

进程异常终止

       进程出异常,本质上是收到了信号,自己终止了进程,此时虽然也有退出码,但是此时的退出码已经没有意义。比如我们熟知的杀死进程的指令: kill -9, 该命令其实就是一个信号,当进程收到这样的一个信号,就会自己停止并退出进程。我们常见的一些信号如下:

上面的这些信号,每一种信号都有对应的数字,当我们的代码出现了问题导致无法正常执行,操作系统就会给我们的进程发送指定的信号,进程收到指定的信号之后,就会对应的停止我们进程并返回错误原因,既然是这样的话,也就是说,一个正常的代码,在运行过程中,只要收到了信号,该进程就会立即响应并退出,我们来验证一下,

进程退出总结

未完待续~~~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSP-J 2023 第二轮认证入门级(含答案)

一。题目 二。答案 T1 ⼩苹果&#xff08;apple&#xff09; 每⼀轮拿掉的苹果数量为 。模拟拿苹果的过程&#xff0c;每⼀轮中令 &#xff0c;当 时最后⼀个苹果会被拿掉。 时间复杂度为对数。 #include <iostream> using namespace std; int n; int ans1, ans2; boo…

上海高考语文命题趋势和备考建议?附1990年-2023年高考语文真题和答案资源

虽然语文是我们的母语&#xff0c;但是语文从小到大都是我们学习的重点&#xff0c;更是难点&#xff0c;分值也是最高的科目之一。甚至很多时候&#xff0c;语文科目的分值差会带来最终的分值差。综观各个省市的高考状元&#xff0c;基本上语文科目都在130分以上&#xff08;满…

【DOCKER】

Docker 出现&#xff1a; 解决了运行环境和配置问题的软件容器。 方便做持续集成并有助于整体发布的容器虚拟化技术。 面试题&#xff1a; 容器和虚拟机比较&#xff1f; 区别&#xff1a; 1.Docker的三件套 1.镜像&#xff1a; 2.容器 3.仓库 2. 基础架构图 2.…

JavaScript_Pig Game切换当前玩家

const current0El document.getElementById(current--0); const current1El document.getElementById(current--1); if (dice ! 1) {currentScore dice;current0El.textContent currentScore;} else {} });这是我们上个文章写的代码&#xff0c;这个代码明显是有问题的&…

【爬虫】python打包可执行程序(ui界面制作完成后)

1.安装pyinstaller pip install pyinstaller可能出现连接超时安装不上的情况,可以切换源进行下载 pip install -i http://pypi.douban.com/simple/ pyinstaller2.打包程序 pyinstaller xxxxx.py --noconsole --hidden-import PySide6.QtXml

基于非侵入式负荷检测与分解的电力数据挖掘

基于非侵入式负荷检测与分解的电力数据挖掘 在这里插入图片描述 **摘要&#xff1a;本案例将根据已收集到的电力数据&#xff0c;深度挖掘各电力设备的电流、电压和功率等情况&#xff0c;分析各电力设备的实际用电量&#xff0c;进而为电力公司制定电能能源策略提供一定的参…

element ui el-table表格纵向横向滚动条去除并隐藏空白占位列

需求 当table内容列过多时&#xff0c;可通过height属性设置table高度以固定table高度、固定表头&#xff0c;使table内容可以滚动 现在需求是右侧滚动条不好看&#xff0c;需要去除滚动条&#xff0c;并隐藏滚动条所占列的位置 // ----------修改elementui表格的默认样式-…

雨云游戏云面板服使用教程我的世界Forge服务端开服教程(翼龙面板)

雨云面板服目前支持一键开服的游戏有&#xff1a;Minecraft Java版、Minecraft 基岩版、泰拉瑞亚、饥荒&#xff0c;还提供纯Java/Linux环境&#xff08;Docker&#xff09;&#xff0c;方便开自己开其他游戏服。 其中Minecraft Java版支持一键开服的有Arclight、Mohist、CatS…

如何使用gpt提高效率

如何使用gpt提高效率 自动化替代人力工作减少创意工作需求技术依赖风险实际应用领域内容生成自动回答问题自动化编程个性化推荐 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f3fb; 《java 面试题大全》 &#x1f369;惟余辈才疏学浅&…

shouldComponentUpdate 是做什么的?

目录 前言 生命周期函数 shouldComponentUpdate 的写法和用法 代码 事件和API 优缺点 方法 总结 理论 结论 shouldComponentUpdate 是 React 类组件中的一个生命周期方法&#xff0c;用于决定一个组件的 props 或 state 发生变化时是否应该重新渲染。默认情况下&…

jenkins自动化操作步骤(gitblit)

1、登陆地址&#xff1a; http://xxxxxxxxx.org:xxxx/ admin/xxxx 2、创建任务 选择构建一个maven项目 3、配置 最多只保留一天一个任务 选择git仓库和账号密码 选择代码对应分支 build项&#xff1a; 1&#xff09;使用父项目的pom文件&#xff1a;k56-boot/pom.xml 2&…

【Javascript】定时器

目录 延迟执行 定时执行 清除定时任务 延迟执行 setTimeout(function(){}, 毫秒) console.log(1); console.log(2); console.log(3); setTimeout(function (){console.log(5) },5000) console.log(4);setTimeout(function (){ console.log(5) },5000) 设定了一个任务&…

C++STL----list的使用

文章目录 list简介list的使用默认成员函数的使用list容器元素的修改front和backpush_front和pop_frontpush_back和pop_backinserterase list迭代器begin和endrbegin和rend list大小控制resizeclear list操作函数sortspliceremoveremove_ifuniquemergereverseassign CSTL----lis…

如何快速解决d3dcompiler_43.dll缺失问题?五种方法快速解决

在计算机使用过程中&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中之一就是“D3DCompiler_43.dll缺失”。这个错误通常会导致游戏、应用程序或系统无法正常运行。为了解决这个问题&#xff0c;我们需要采取一些修复方案来恢复缺失的文件。本文将介绍五个修复D3DCompi…

Monocular arbitrary moving object discovery and segmentation 论文阅读

基本信息 题目&#xff1a;Monocular Arbitrary Moving Object Discovery and Segmentation 作者&#xff1a; 来源&#xff1a;BMVC 时间&#xff1a;2021 代码地址&#xff1a;https://github.com/michalneoral/Raptor Abstract 我们提出了一种发现和分割场景中独立移动的…

Linux--进程替换

1.什么是进程替换 在fork函数之后&#xff0c;父子进程各自执行代码的一部分&#xff0c;但是如果子进程想要执行一份全新的程序呢&#xff1f; 通过进程替换来完成&#xff0c;进程替换就是父子进程代码发生写时拷贝&#xff0c;子进程执行自己的功能。 程序替换就是通过特定的…

NNDL:作业五

习题4-1 对于一个神经元,并使用梯度下降优化参数w时,如果输入x恒大于0,其收敛速度会比零均值化的输入更慢. 证明&#xff1a; 激活函数以sigmoid为例。 神经元&#xff1a;有两层&#xff0c;线性层和激活层&#xff1a;yw*xb,然后y‘sigmoid(y)&#xff0c;也就是。 梯度…

【算法练习Day31】单调递增的数字买卖股票的最佳时机含手续费监控二叉树

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 单调递增的数字买卖股票的最…

缺少d3dx9_43.dll怎么解决 win系统如何运行dll文件?

大家好&#xff01;今天我来给大家分享一下关于d3dx9_43.dll缺失的4种详细解决方案。 首先&#xff0c;让我们了解一下d3dx9_43.dll是什么文件。其实&#xff0c;d3dx9_43.dll是DirectX的一个组件&#xff0c;它主要负责处理游戏中的一些特效和动画效果。如果这个文件丢失了&a…

JAVA毕业设计104—基于Java+Springboot+Vue的医院预约挂号小程序(源码+数据库)

基于JavaSpringbootVue的医院预约挂号小程序(源码数据库)104 一、系统介绍 本系统前后端分离带小程序 小程序&#xff08;用户端&#xff09;&#xff0c;后台管理系统&#xff08;管理员&#xff0c;医生&#xff09; 小程序&#xff1a; 预约挂号&#xff0c;就诊充值&…
最新文章