linux-----进程控制

提示:以下是本篇文章正文内容,下面案例可供参考

一、fork()函数

返回值:子进程返回0,父进程返回子进程的id,出错就返回-1.

 fork创建子进程,如果父子一方发生写入时,就会发生写实拷贝,操作系统就会重新申请空间,发生拷贝,修改页表,构建新的虚拟到物理的映射关系。

发生写实拷贝的过程中是怎么样的,fork创建子进程时,操作系统会把父进程的页表项都改为只读,子进程拷贝了一份父进程的页表,发生写入时,由于页表项都是只读的权限,就会因为权限问题出错,这时操作系统就会介入,查看是什么原因出错,例如栈堆区的数据发生修改等,由于这个地方的数据原来就是可读可写的,那么就会发生写实拷贝,重新申请空间,构建虚拟到物理的映射,如果是由于只读常量区发生修改,这个地方本来就是可读不可写的,那么程序就会出错。

我们可以创建多个进程来帮我们执行任务:记得让父进程等待子进程,子进程退出了,它的数据和内存就释放了,不过管理这个进程的PCB还没有释放,就会有大量的僵尸进程,消耗系统内存资源,变卡。

二、进程的中止

1.进程的退出方法

除了main函数return可以退出,还有exit和_exit.它两之间还是有区别的 。exit库函数封装了_exit.exit是库函数而_exit是系统调用。mian函数返回时也会调用了exit.所有也会刷新缓冲区的数据

exit会刷新缓冲区,而_exit不会刷新。

这里我们可以预想一下,其实输出输出都有缓冲区,一般输出时带个\n就会刷新缓冲区,还有就是main函数return返回时也会刷新缓冲区,可是_exit是系统系统调用,exit是函数调用,说明这个缓冲区不是内核缓冲区。 

验证:先不让父进程退出。第一个子进程应该是休眠十秒后,刷新缓冲区,显示打印的结果,而不是打印时直接显示到屏幕上。第二个由于没有休眠return直接刷新缓冲区。结果应该是“hello _exit”休眠十秒后显示第一个子进程要打印的内容。

2.进程退出码和错误码

错误码:这个是在c语言中,是个全局变量。如果库函数调用出错,那么就会把错误码设置,我们要知道错误的原因可以使用strerror打印。这里我们打印了0-9错误码的代表的含义

进程退出码:是进程退出也就是main函数的返回值(注意区分函数中的return),在bash中我们可以拿到最近一次程序的退出码,通过命令获取:echo $?。(echo命令也是个程序,bash通过创建子进程来执行的)。

一个程序退出一共有三种状态,代码跑完,结果正确,代码跑完,结果不正确,程序异常中止,代码没跑完。通过退出码获取进程执行的结果

退出码为0,代表程序没出错,跑完了。一般退出码非0,代表程序出问题了,非0的情况一般分为两种,我们自己定义的退出码,还有一种是操作系统对进程发出信号中止进程的退出码,比如除零错误。我们还可以根据自己的需求自己定义退出码,根据退出码打印原因。    

这个由于除零异常,操作系统直接发信号给进程,提前退出了。bash是父进程,

通过创建子进程来执行./a.out.bash拿到子进程的退出码,然后解释退出的原因。 

进程异常退出是收到了信号,我们可以给进程发信号,即使这个程序是正常运行的。我们给进程发个浮点数异常的信号(8号信号SIGFPE)。

总结:一个程序出异常肯定是收到了操作系统给进程发出的信号,如果没出异常代码跑完了,那么我们可以通过进程的退出码,来判断程序的执行的结果的状态,结果是否符合我们的预想。

3.进程等待

(1)wait()

 等待父进程的任意一个子进程的退出。就是父进程哪个子进程先退出,就等待哪个。

(2)waitpid()

第二个函数的第一个参数是子进程的pid,指定等待哪个子进程退出。int* wstatus是个输出型参数,通过它可以拿到进程的退出码,第三个参数是设置是否堵塞式等待。注意的是,如果options为零,它是个堵塞式等待函数,只有等待成功(条件:子进程退出状态为僵尸)函数返回值为被等待的子进程的pid,才会向下执行,如果options不为零,就是非堵塞式等待了。

大多情况下下,我们使用这个非堵塞式等待,如果刚好子进程退出了,那么它的返回值为子进程的pid,如果子进程没退出(条件没具备:子进程没退出,状态不是僵尸)函数返回值为0,如果返回值小于0说明等待失败了。要注意的是,不管有没有等待成功(返回值为0或者为子进程的pid),它都会向下执行父进程的代码,不会堵塞式等待成功后,才去执行后面的代码。

这里我们用非堵塞式等待

如何等待一批进程然后进行回收。一种是记录子进程的pid,然后根据子进程的数量,一个个等待。

不过我们一般不知道哪个进程先退出,效率不高。直接将waitpid的第一个参数设为-1. 表示等待任意一个进程退出,这个和wait比较像。

 ​​​​​​​

4.如何获取进程的status

status是个int类型的参数,通过函数调用拿到进程PCB中status,不过我们主要看后面的低16位,它可以记录退出码和退出信号。进程退出时或者中止时,操作系统会通过这个进程PCB中status,记录退出码或者收到的信号,同时将进程状态修改为僵尸。

如果进程正常终止后八位无意义,进程异常中止前8位无意义。

我们可以通过等待函数的输出型参数拿到这个数字,获取进程退出的状态。

当然我们直接通过宏来直接获取子进程的退出码

 

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

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

相关文章

【AD24报错】PCB调整线宽后提示 Width Constraint: Track ### on Top Layer的解决方案

【AD24报错】PCB调整线宽提示Width Constraint: Track(##mil, ##mil)(##mil, ##mil)on Top Layer的解决方案 一、Width Constraint问题复现二、有关于Width Constraint的解决方案三、可能导致 Width Constraint 报错的其他因素&am…

C++初阶:STL详解(六)——list的介绍和使用

✨✨小新课堂开课了,欢迎欢迎~✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C:由浅入深篇 小新的主页:编程版小新-CSDN博客 前言: 前面我们已经了解了strin…

c++----io流

提示:以下 是本篇文章正文内容,下面案例可供参考 1.标准io流 (1)数据的循环输入 对于内置类型:cin和cout直接使用,c已经重载了 (2)对于自定义类型: 需要我们自己对类型进行重载 2.文件io流 ifstream ifile(只输入…

机器学习中结构风险最小化的正则化项用途及原理详解

一、概述 数学和工程领域,正则(Regularize)意味着使某物标准化或规范化,在机器学习领域指的是使模型的行为更加规范化,以避免极端或过于复杂的模型。 正则化项(Regularization Term)是机器学习模型中用于控制模型复杂…

力扣72-编辑距离(Java详细题解)

题目链接:力扣72-编辑距离 前情提要: 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。 5.如果没有ac打印dp数组 利于debug。 每一个dp…

鸿蒙OpenHarmony【轻量系统内核扩展组件(动态加载)】子系统开发

基本概念 在硬件资源有限的小设备中,需要通过算法的动态部署能力来解决无法同时部署多种算法的问题。以开发者易用为主要考虑因素,同时考虑到多平台的通用性,LiteOS-M选择业界标准的ELF加载方案,方便拓展算法生态。LiteOS-M提供类…

微信小程序认证流程

官方描述: 微信接口服务:即微信服务器。 具体的流程如下: 1.前端调用wx.login()获取登录凭证code 2.前端请求后端进行认证,发送code 3.后端请求微信获取openid 4.后端生成认证成功凭证返回给前端。 说明 调用 wx.login() 获…

【二等奖论文】2024年华为杯研赛C题54页成品论文(后续会更新)

您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片,那是获取论文的入口! 点击链接获取【2024华为杯研赛资料汇总】:https://qm.qq.com/q/Nr0POlQGc2https://qm.qq.com/q/Nr0POlQGc2 摘 要: 随着国民经济发…

简易CPU设计入门:取指令(一),端口列表与变量声明

取指令这一块呢,个人觉得,不太好讲。但是呢,不好讲,我也得讲啊。那就尽量地讲吧。如果讲得不好的话,那么,欢迎大家提出好的意见,帮助我改进讲课的质量。 首先呢,还是请大家去下载本…

nodejs基于vue电子产品商城销售网站的设计与实现 _bugfu

目录 技术栈具体实现截图系统设计思路技术可行性nodejs类核心代码部分展示可行性论证研究方法解决的思路Express框架介绍源码获取/联系我 技术栈 该系统将采用B/S结构模式,开发软件有很多种可以用,本次开发用到的软件是vscode,用到的数据库是…

FiBiNET模型实现推荐算法

1. 项目简介 A031-FiBiNET模型项目是一个基于深度学习的推荐系统算法实现,旨在提升推荐系统的性能和精度。该项目的背景源于当今互联网平台中,推荐算法在电商、社交、内容分发等领域的广泛应用。推荐系统通过分析用户的历史行为和兴趣偏好,预…

java项目之线上辅导班系统的开发与设计

项目简介 基于springboot的线上辅导班系统的开发与设计的主要使用者分为: 管理员在后台主要管理字典管理、论坛管理、公开课管理、课程管理、课程报名管理、课程收藏管理、课程留言管理、师资力量管理、用户管理、管理员管理等。 💕💕作者&a…

单细胞monocle3分析流程再整理

重读上一篇关于monocle3的推文的时候感觉内容冗长繁琐,因此笔者把关键部分代码稍作了整理。 推文链接:单细胞拟时序/轨迹分析monocle3流程学习和整理 https://mp.weixin.qq.com/s/NRrFH8sjdUUq20z9hWAFyQ 也可以看一看monocle2推文: 单细胞…

探索 ShellGPT:终端中的 AI 助手

文章目录 探索 ShellGPT:终端中的 AI 助手背景介绍ShellGPT 是什么?如何安装 ShellGPT?简单的库函数使用方法场景应用常见问题及解决方案总结 探索 ShellGPT:终端中的 AI 助手 背景介绍 在当今快速发展的技术领域,命…

双非本 985 硕士,秋招上岸字节算法岗!

最近已有不少大厂都在秋招宣讲了,也有一些在 Offer 发放阶段。 节前,我们邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对新人如何快速入门算法岗、如何准备面试攻略、面试常考点、大模型项目落地经验分享等热门话题进行了深入的讨论。…

Chainlit集成LlamaIndex实现知识库高级检索(自动合并检索)

检索原理 自动合并检索 自动合并检索原理,和我的上一篇文章的检索方案: 将文本分割成512大小(一般对应段落大小)和128(一般对句子大小不是严格的句子长度)大小两种分别存储到索引库,再用llama_…

架构设计笔记-5-软件工程基础知识

知识要点 按软件过程活动,将软件工具分为软件开发工具、软件维护工具、软件管理和软件支持工具。 软件开发工具:需求分析工具、设计工具、编码与排错工具。 软件维护工具:版本控制工具、文档分析工具、开发信息库工具、逆向工程工具、再工…

快速解决Isaac Sim资源获取不到问题

国内使用Isaac Sim的时候,最常见的问题是加载不了USD或材质资源,这会导致整个Isaac Sim软件卡住或崩溃,以及无法继续开展项目。比如加载realsense或,最新的Isaac Sim 4.2.0 加载一个激光雷达,都要获取相关传感器usd&am…

桶排序和计数排序(非比较排序算法)

桶排序 桶排序是一种基于分配的排序算法,特别适合用来排序均匀分布的数据。它的基本思想是将输入的数据分到有限数量的桶里,然后对每个桶内的数据分别进行排序,最后再将各个桶内的数据合并得到最终的排序结果。(通常用于浮点数,因…

RuntimeError: Maximum Recursion Depth Exceeded - 递归深度超限的完美解决方案

RuntimeError: Maximum Recursion Depth Exceeded - 递归深度超限的完美解决方案 🛠️ RuntimeError: Maximum Recursion Depth Exceeded - 递归深度超限的完美解决方案摘要 📃引言 ✨1. 什么是递归?🔍1.1 递归的基本概念 &#x…