linux-----进程控制

news2024/11/14 20:34:56
提示:以下是本篇文章正文内容,下面案例可供参考

一、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.coloradmin.cn/o/2157102.html

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

相关文章

专业学习|动态规划(概念、模型特征、解题步骤及例题)

一、引言 (一)从斐波那契数列引入自底向上算法 (1)知识讲解 (2)matlap实现递归 (3)带有备忘录的遗传算法 (4)matlap实现带有备忘录的递归算法 “&#xff1…

0基础跟德姆(dom)一起学AI 数据处理和统计分析06-数据组合和缺失值处理

* 数据组合 * concat * merge * join(了解) * 缺失值处理 * apply方法详解 --- 1.DataFrame数据组合-concat连接 * 概述 * 连接是指把某行或某列追加到数据中, 数据被分成了多份可以使用连接把数据拼接起来 * 把计算的结果追加到现有数据集,也可以使用连…

Redis:常用命令总结

目录 1 . 前置内容 1.1 基本全局命令 KEYS EXISTS DEL EXPIRE TTL TYPE 1.2 数据结构和内部编码 2. String类型 SET GET MGET MSET INCR INCRBY DECR DECRBY INCRBYFLOAT 命令小结​编辑 内部编码 3 . Hash 哈希类型 HSET HGET HEXISTS HDEL HKEYS …

Qemu开发ARM篇-5、buildroot制作根文件系统并在qemu中进行挂载启动

文章目录 1、 buildroot源码获取2、buildroot配置3、buildroot编译4、挂载根文件系统 在上一篇 Qemu开发ARM篇-4、kernel交叉编译运行演示中,我们编译了kernel,并在qemu上进行了运行,但到最后,在挂载根文件系统时候,挂…

嵌入式单片机STM32开发板详细制作过程--01

大家好,今天主要给大家分享一下,单片机开发板的制作过程,原理图的制作与PCB设计,以及电子元器件采购与焊接。 第一:单片机开发板成品展示 板子正面都有各个芯片的丝印与标号,方便焊接元器件的时候,可以参考。(焊接完成之后,成品图如下) 第二:开发板原理图制作 在制…

OpenCV系列教程三:形态学、图像轮廓、直方图

文章目录 一、形态学1.1 阈值处理1.1.1 全局阈值处理1.1.2 全局阈值处理之Otsus 阈值法1.1.3 自适应阈值处理 1.2 腐蚀与膨胀1.2.1 腐蚀操作1.2.2 创建形态学卷积核1.2.3 膨胀操作 1.3 开运算和闭运算1.4 形态学梯度1.5 顶帽操作(tophat)1.6 黑帽操作(Black Hat&…

基于JAVA+SpringBoot+Vue的社区智慧养老监护管理平台

基于JAVASpringBootVue的社区智慧养老监护管理平台 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接&#x1…

Arthas heapdump(dump java heap, 类似 jmap 命令的 heap dump 功能)

文章目录 二、命令列表2.1 jvm相关命令### 2.1.8 heapdump(dump java heap, 类似 jmap 命令的 heap dump 功能)举例1:假设你想生成一个只包含活动对象的堆转储文件,并将其保存为 /tmp/heapdump.hprof举例2:如果你想要进…

社区团购的创新与变革——融合开源链动 2+1 模式、AI 智能名片及 S2B2C 商城小程序

摘要:本文从信息流、资金流、物流角度深入分析社区团购的特点,探讨其如何避免传统线下中心零售的高展示成本与传统电商的高交付成本。同时,引入开源链动 21 模式、AI 智能名片及 S2B2C 商城小程序等创新元素,阐述它们为社区团购带…

MySQL---创建数据库(基于SQLyog)

目录 0.前言 1.基本认识 1.1编码集 1.2检验规则 2.库的创建和销毁 2.1指令介绍 2.2你可能会出现的问题 3.查看数据库属性 4.创建指定数据库 5.创建表操作 0.前言 之前写过一篇这个关于表的创建和销毁的操作,但是当时是第一次学习,肯定有些地方…

华为OD机试 - N个选手比赛前三名、比赛(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(E卷D卷A卷B卷C卷)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加…

【STM32】TIM定时器定时中断与定时器外部时钟的使用

TIM定时器定时中断与定时器外部时钟的使用 一、TIM定时器简介1、TIM(Timer)定时器2、定时器类型3、高级定时器4、通用定时器5、基本定时器6、定时中断基本结构代码编写:定时中断/外部时钟定时中断 7、预分频器时序8、计数器时序9、计数器无预…

手写SpringMVC

1、开发HspDispatcherServlet 2、完成客户端/浏览器可以请求控制层 目的:发出url请求时,经过前端控制器,找到Monster的List方法,把结果再打回去 3、从web.xml动态获取hspspringmvc.xml 4、完成自定义Service注解功能 目的&…

【功能详解】IoTDB 与 ThingsBoard 成功集成!

可视化工具集成1 IoTDB 实现了 ThingsBoard 的无缝集成对接,IoTDB 构建的工业数据存储处理-可视化呈现链路又多了一种可用、易用的工具选择。 我们的代码已贡献到 ThingsBoard 社区(待发版),用户手册也已发布(可点击下…

HBASE_题库详解

1、 HBase的特点是什么? 1)大:一个表可以有数十亿行,上百万列 2)无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列 3…

浪涌抑制-功率NTC选型计算

目录: 一、概述 二、NTC抑制浪涌原理 三、功率NTC的介绍 四、功率NTC选型原则 1、峰值正向浪涌电流 2、阻值选取 3、正常工作的计算 一、概述 NTC热敏电阻除用于温度测量(热敏电阻温度检测-分段曲线拟合、Steinhart-Hart与查表)外,在电源中常用于…

word如何快速打开文档中的网址超链接?

1、鼠标放在文档中超链接上: 2、然后左手按住【CTRL】键,之后鼠标光标会变成一个手形, 然后右手,点击鼠标左键,即可快速使用电脑当前设置的默认浏览器打开并跳转到网址:

三阶魔方还原法 勾上回下 上右左左右

三阶魔方还原法: 1小白花 (转3换1) 2白十字架 (侧与中心同色 下下) 3第一层 (找位置角块放顶点 勾上回下) 4 第二层 (颜色边 勾上回下 再单白边 勾上回下) 5 黄十字架 (无黄边 压 勾…

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

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

告别枯燥:我开发了一个在电脑桌面上使用弹幕来背单词的软件

前言 在这个快节奏的时代,我们每天都在忙碌中度过,手机虽然方便,但往往难以找到一整块时间来专心背单词。然而,你是否意识到,每天坐在电脑前的时间远比使用手机的时间要长?现在我们来介绍一个新型的学习软…