【Linux】进程(9):进程控制1
大家好,我是苏貝,本篇博客带大家了解Linux进程(9)进程控制1,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
目录
- 1 fork函数
- 2 进程终止
- (A)终止是在做什么?
- (B)退出码
- (C)进程退出的3种情况
- (D) 如何终止进程
- 1. main函数return表示进程终止(非main函数return表示函数结束)
- 2. 代码调用exit函数
- 3. _exit函数 ---系统调用
1 fork函数
如果fork出错,那就不创建子进程,给父进程返回-1
为什么给父进程返回的是子进程的pid?
为了让父进程方便对子进程进行标识,进而进行管理
如何理解进程具有独立性?
进程=内核的相关管理数据结构(task_struct+mm_struct+页表)+代码和数据。对于不是父子进程的多个进程,上面的5个都不同,自然具有独立性。对于父子进程,task_struct自然不同;子进程的mm_struct和页表都是拷贝父进程的,但每个进程都有自己独立的mm_struct和页表,所以也互不影响;代码是共享的,也是只读的,所以父子进程互不影响;对于数据:父子不写入时,数据也是共享的;如果其中一个进程想要对数据进行写入,会发生写时拷贝,因此父子进程也互不影响。所以,父子进程也具有独立性,所以进程具有独立性
2 进程终止
(A)终止是在做什么?
- 释放曾经的代码和数据所占据的空间
- 释放内核数据结构(mm_struct和页表)的空间,但是task_struct会维持一段时间,变成Z状态(僵尸状态),进程要维持自己的退出信息,退出信息位于task_struct中,未来让父进程进行读取
(B)退出码
退出码是在进程执行结束后,系统返回给使用者的一个数值,用以表示进程的执行状态。main函数最后的return后面的数字是退出码。
所以上面代码的退出码就是0,那如何查看退出码呢?用echo $?命令,Linux提供了一个专门的变量?来保存父进程获取的,最近一个子进程的退出码
修改.c文件
退出码应该为100
上面说,?是保存父进程获取的,最近一个子进程的退出码,那为什么第二次?的值是0呢?
第二次的?是保存第一个echo $?的退出码,虽然echo不是bash的子进程,但也是由bash执行的,所以照样可能会影响退出码。因为第一个echo $?运行成功,所以退出码为0
退出码有什么用呢?
告诉关心方(一般为父进程),进程把任务完成的怎么样了。
如果退出码为0,表示程序运行成功;为!0,表示失败。不同的!0值,一方面表示失败,一方面也表示失败的原因,即有对应的错误描述
现在我们来看看退出码对应的错误描述
先看strerror函数,作用:返回错误码的字符串描述。参数是错误码
修改.c文件
0表示成功,1表示操作不被允许,2表示没有该文件或目录……
关于退出码,我们可以选择使用系统默认的,也可以使用我们自定义的。
我们来试试用自定义的退出码
修改.c文件
但我们发现,如果result==-1,我们不能确定是y == 0还是y! =0,x/y == -1
修改.c文件
如果result==-1,错误码== 1,那么说明y== 0。如果result==-1,错误码== 0,说明x/y ==-1
因此,退出码可以确定代码跑完,结果是否正确。所以,你是否感觉到以前写的代码都不是很规范呢?有没有正确使用退出码呢?
(C)进程退出的3种情况
- 代码跑完,结果正确
- 代码跑完,结果不正确
- 代码执行时,出现异常,提前退出了
前2个可以根据退出码判断,就不再赘述了。现在我来看看第3种情况:代码执行时,出现异常,提前退出了
我们之前在写代码的时候,一定遇到过程序崩溃的情况吧。崩溃是语言层面说的,在系统层面,是因为操作系统发现你的进程做了不该做的事情,所以将进程杀掉了。
所以进程出异常的本质是因为进程收到了OS发给进程的信号
现在我们来用野指针让进程出异常
出现异常,并报错:Segmentation fault,表示段错误。OS提前终止进程
上面说,进程出异常的本质是因为进程收到了OS发给进程的信号,现在让我们来感受一下
修改.c文件
该进程正常来讲的话,是不会有异常的
再使用kill的11号信号
此时尽管代码没有错误,但是由于进程收到了系统的信号,所以判断是 Segmentation fault,段错误标识,进程提前终止了。因此我们也可以感受到进程出异常是因为进程收到了OS发给进程的信号
因此,我们可以通过看进程退出的时候,退出信号是什么,来判断我的进程为什么异常了。如果进程没有异常,代码跑完了,那退出信号为0
请问,如果进程出现异常,提前退出了,那还需要知道退出码吗?不用了,进程出现异常,退出码就没有意义了
如何确定程序退出是3种情况的哪一种呢?
- 先确认是否异常
- 不是异常,就是代码跑完了,看退出码判断结果是否正确
结论:衡量一个进程退出,我们只需要知道2个数字:退出码和退出信号
退出码为0,退出信号为0,代码跑完了,结果正确
退出码为!0,退出信号为0,代码跑完了,结果不正确
退出码为0,退出信号为!0,进程出现异常
退出码为!0,退出信号为!0,进程出现异常
一个进程结束,系统会释放它对应的代码和数据的空间,释放内核数据结构(mm_struct和页表),但是task_struct会维持一段时间,变成Z状态(僵尸状态),系统会将进程的退出码和退出信号写入进程的task_struct中,等待父进程进行读取
(D) 如何终止进程
1. main函数return表示进程终止(非main函数return表示函数结束)
2. 代码调用exit函数
先了解exit函数,作用:让一个正常的进程终止,参数是退出码
修改.c文件
退出码:123
上面说,main函数return表示进程终止(非main函数return表示函数结束)。那如果是在非main函数中调用exit函数,是表示函数结束还是进程终止呢?
修改.c文件
运行程序,先进入Div函数,因为100!=0,所以执行代码exit(13)
进程并没有打印main函数的printf函数里的内容,所以在非main函数中调用exit函数,是进程终止。
所以在代码的任意位置调用exit函数,都表示进程退出
3. _exit函数 —系统调用
先了解一下_exit,作用:终止进程,参数也是退出码
修改.c文件
进程也没有打印main函数的printf函数里的内容,所以在代码的任意位置调用_exit函数,都表示进程退出
那exit函数和_exit函数有什么不同吗?
修改.c文件
结果:先等待2秒,再打印出”hello world”,这说明exit函数会冲刷缓冲区
修改.c文件
结果:等待2秒后,不会打印”hello world” ,这说明_exit函数不会冲刷缓冲区
exit vs _exit:exit函数会冲刷缓冲区,而_exit不会。
这说明,我们所说的缓冲区不在OS内,即不是内核缓冲区。
理由:
-
exit底层调用的就是_exit,因为杀掉进程本质就是释放进程对应的代码和数据,释放进程的除pcb以外的其它内核数据结构。总之,是对进程做管理的一种方式。但用户没有权利对操作系统内的字段做任何访问,包括终止一个进程。因此,exit底层一定会调用_exit系统调用
如果缓冲区在操作系统,exit能冲刷缓冲区,那么_exit也能,因为exit底层调用的就是_exit。但是_exit不能,因此缓冲区不在OS内,即不是内核缓冲区,而在_exit之上,exit先冲刷缓冲区,再调用_exit
好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️
相关文章:
【Linux】进程(9):进程控制1
大家好,我是苏貝,本篇博客带大家了解Linux进程(9)进程控制1,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 1 fork函数2 进程终止(A)终止是…...
华为RH2288H V3服务器iBMC的SSL证书续期
本文对华为RH2288H V3服务器iBMC的SSL证书续期,以避名登录告警提示及主机状态异常。 一、检查现网服务器iBMC的SSL证书到期时间 登录iBMC,点击配置--SSL证书,如下: 可以看到本服务器SSL证书将于今年7月22日到期。 二、联系厂家…...
ubuntu开机黑屏
BusyBox v1.30.1 (Ubuntu 1:1.30.1-4ubuntu6.1) built-in shell (ash) Enter help for a list of built-in commands. 解决: help 看看哪个盘出问题了 fsck -y /dev/sda1 (出问题的磁盘/分区) reboot 就可以进入系统了 fsck命令…...
【risc-v】arm和riscv有什么关系或者联系?
ARM和RISC-V都是基于精简指令集计算(RISC)原理的处理器架构,它们在设计理念上有一定的联系,但同时存在一些关键的区别: 设计理念:ARM和RISC-V都采用了RISC的核心设计原则,即通过简化指令集来提高…...
Flutter项目开发模版,开箱即用
前言 当前案例 Flutter SDK版本:3.22.2 每当我们开始一个新项目,都会 引入常用库、封装工具类,配置环境等等,我参考了一些文档,将这些内容整合、简单修改、二次封装,得到了一个开箱即用的Flutter开发模版…...
私有仓库搭建
目前市面上比较常见的私有仓库搭建方法为: 通过 Sinopia 或 verdaccio 搭建(Sinopia 已经停止维护,verdaccio 是 Fork 自 Sinopia,基本上大同小异),其优点是搭建简单,不需要其他服务。通过 cnp…...
axios设置 responseType为 “stream“流式获取后端数据
使用前景: 工作过程中遇到了后端接口响应过慢,前端界面一致loading的情况,这个时候可以尝试采用将Axios的responseType参数被设置为stream类型实现。 stream介绍: stream类型意味着你希望服务器响应的数据以Node.js流ÿ…...
Apache POI(使用Java读写Excel表格数据)
1.Apache POI简介 Apache POI是一个开源的Java库,用于操作Microsoft Office格式的文件。它支持各种Office文档的读写功能,包括Word文档、Excel电子表格、PowerPoint演示文稿、Outlook电子邮件等。Apache POI提供了一组API,使得Java开发者能够…...
golang中只用定义不用初始化的类型规律总结
在go语言的开发中,有很多的内置类型是我们只需要定义而不需要初始化的, 如上文中提到的bytes.Buffer, strings.Builder。 其实在go语言中官方给我们定义的很多的类型都只需要定义,不需要初始化。 他们都有2个共同的规律ÿ…...
数据库之PostgreSQL详解
一、PostgreSQL介绍 PostgreSQL是一个功能强大的 开源 的关系型数据库。底层基于C实现。 PostgreSQL的开源协议和Linux内核版本的开源协议是一样的。。BDS协议,这个协议基本和MIT开源协议一样,说人话,就是你可以对PostgreSQL进行一些封装&a…...
找出链表倒数第k个元素-链表题
LCR 140. 训练计划 II - 力扣(LeetCode) 快慢指针。快指针臂慢指针快cnt个元素到最后; class Solution { public:ListNode* trainingPlan(ListNode* head, int cnt) {struct ListNode* quick head;struct ListNode* slow head;for(int i …...
ssm629基于SSM的二手交易平台设计与开发+jsp【已测试】
前言:👩💻 计算机行业的同仁们,大家好!作为专注于Java领域多年的开发者,我非常理解实践案例的重要性。以下是一些我认为有助于提升你们技能的资源: 👩💻 SpringBoot…...
【Unity】资源管理与热更 YooAsset+HybridCLR
1 前言 Unity资源管理与热更新该用什么方法?当然是YooAssetHybridCLR了,YooAsset负责资源管理与热更,HybridCLR负责支持代码热更。 但这里我就不自己讲了,我会提供相关学习链接(前人栽树我躺平)。 2 学习链…...
PDF批量加水印 与 去除水印实践
本文主要目标是尝试去除水印,但是为了准备测试数据,我们需要先准备好有水印的pdf测试文件。 注意:本文的去水印只针对文字悬浮图片悬浮两种特殊情况,即使是这两种情况也不代表一定都可以去除水印。 文章目录 批量添加透明图片水印…...
【MySQL】服务器配置和管理
本文使用的MySQL版本是8.0 MySQL服务器介绍 MySQL服务器通常说的是mysqld程序。 mysqld 是 MySQL 数据库服务器的核心程序,负责处理客户端的请求、管理数据库和执行数据库操作。管理员可以通过配置文件和各种工具来管理和监控 mysqld 服务器的运行 官方文档&…...
限流定义、算法、实施方案
限流定义 1、 时间 , 基于某段时间或某个时间点,即:时间窗口 2、资源: 对可用资源进行限制: QPS/连接数/传输速率/黑白名单等 分布式环境下,主流限流方案: 网关层限流:流量入口Ngi…...
[312. 戳气球] 动态规划寻找转移函数
Problem: 312. 戳气球 文章目录 思路Code 思路 这个哥们写的思路真的很牛逼,转载一下他。 戳气球题解 Code class Solution { public:int maxCoins(vector<int>& nums) {nums.insert(nums.begin(), 1);nums.push_back(1);int n nums.size();vector<v…...
以操作系统和Java的视角看“中断“
引言 fucking-java-concurrency主要解读了在开发过程中常常会遇到的Java并发问题,本文主要总结Java的中断原理和应用。 PS: https://github.com/WeiXiao-Hyy/blog整理了后端开发的知识网络,欢迎Star! 操作系统的中断 什么是中断࿱…...
【运维】如何在Ubuntu 22上使用Python 3.8的虚拟环境
在Ubuntu 22上使用Python 3.8的虚拟环境安装Ryu是相对简单的。以下是一步一步的指南: https://qq742971636.blog.csdn.net/article/details/139566151 安装Python 3.8: 在Ubuntu 22上,Python 3.8可能不是默认安装的版本。你可以使用以下命令…...
门面模式Api网关(SpringCloudGateway)
1. 前言 当前通过Eureka、Nacos解决了服务注册和服务发现问题,使用Spring Cloud LoadBalance解决了负载均衡的需求,同时借助OpenFeign实现了远程调用。然而,现有的微服务接口都直接对外暴露,容易被外部访问。为保障对外服务的安全…...
玩转Matlab-Simscape(初级)- 09 - 在Simulink中创建曲柄滑块机构的控制模型
** 玩转Matlab-Simscape(初级)- 09 - 在Simulink中创建曲柄滑块机构的控制模型 ** 目录 玩转Matlab-Simscape(初级)- 09 - 在Simulink中创建曲柄滑块机构的控制模型 前言一、问题描述二、创建模型2.1 识别机构中的刚体2.2 确定刚…...
手撸一个java网关框架
手写一个简易的Java网关框架涉及到很多方面,但我会提供一个基本的框架概念和代码示例,帮助你理解网关的基本构建。以下是一个简单的Java网关框架的实现: 定义路由:需要一个路由表来映射请求的URL到对应的处理器。 请求处理&#x…...
亮数据代理IP助力高效数据采集
文章目录 📑前言一、爬虫数据采集痛点二、代理IP解决爬虫痛点2.1 为什么可以2.2 本篇采用的代理IP 四、零代码获取数据4.1 前置背景4.2 亮数据浏览器自动抓取数据4.3 使用步骤: 五、数据集5.1 免费样本5.2 定制数据集 🌤️个人小结 …...
VS2022,DLL1调用lib,lib调用DLL2
DLL1调用lib,lib调用DLL2 问题1:为什么在dll1中需要引入dll2的.lib文件 当你有一个工程(dll1)调用静态库(lib),而静态库(lib)又调用另一个DLL(dll2…...
Unity Mirror VR联机开发 房间篇
一、需求 在联机时通常有加入房间这个步骤,在mirror示例中也有相应的案例,但是那个比较复杂,我们做教育科普类不需要如此复杂,傻瓜式操作基本就可以了,所以我简化了步骤,省略了点击准备按钮这一步骤&#…...
二叉树—leetcode
前言 本篇博客我们来仔细说一下二叉树二叉树的一些OJ题目 请看完上一篇:数据结构-二叉树-CSDN博客 💓 个人主页:普通young man-CSDN博客 ⏩ 文章专栏:LeetCode_普通young man的博客-CSDN博客 若有问题 评论区见📝 &…...
shell编程(二)——字符串与数组
本文为shell 编程的第二篇,介绍shell中的字符串和数组相关内容。 一、字符串 shell 字符串可以用单引号 ‘’,也可以用双引号 “”,也可以不用引号。 单引号的特点 单引号里不识别变量单引号里不能出现单独的单引号(使用转义符…...
【数据结构】二叉树专题
前言 本篇博客我们来看一些二叉树的经典题型,也是对上篇博客的补充 💓 个人主页:小张同学zkf ⏩ 文章专栏:数据结构 若有问题 评论区见📝 🎉欢迎大家点赞👍收藏⭐文章 目录 1.单值二叉树 …...
开源模型应用落地-LangChain高阶-LCEL-表达式语言(四)
一、前言 尽管现在的大语言模型已经非常强大,可以解决许多问题,但在处理复杂情况时,仍然需要进行多个步骤或整合不同的流程才能达到最终的目标。然而,现在可以利用langchain来使得模型的应用变得更加直接和简单。 LCEL是什么? LCEL是一种非常灵活和强大的语言,可以帮助您更…...
Python第二语言(九、Python第一阶段实操)
目录 1. json数据格式 2. Python与json之间的数据转换 3. pyecharts模块官网 4. pyecharts快速入门(折线图) 5. pyecharts全局配置选项 5.1 set_global_ops使用 5.1.1. title_opts 5.1.2 legend_opts 5.1.3 toolbox_opts 5.1.4 visualmap_opts…...
酷家乐网站做墙裙教程/微信朋友圈广告推广代理
1. 题目 原题链接 给你一个 m x n 的矩阵 board ,由若干字符 ‘X’ 和 ‘O’ ,找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充 。 示例 1: 输入:board [[“X”,“X”,“X”,“X”],[“X”…...
阜新网站建设公司/ps培训
Set 属性: Set.prototype.constructor:Set.prototype.size:方法 操作方法 adddeletehasclearArray.from()可以将Set结构转为数组遍历方法 keys():返回键名的遍历器,结果与values()相同values(): 返回键值的遍历器entries():返回键值对的遍历器forEach(value…...
为什么会有人攻击我用织梦做的网站/网站友链交换平台
<script>document.write("<script typetext/javascript src//site.com/js.js?v" Date.now() "><\/script>");</script> 使用了网友的上述方法之后,导致了 layui的 折叠面板 异常无法点击 layui-collapse 排查了3…...
自己做卖东西网站/免费大数据查询
问题描述在操作系统中,数据通常以文件的形式存储在文件系统中。文件系统一般采用层次化的组织形式,由目录(或者文件夹)和文件构成,形成一棵树的形状。文件有内容,用于存储数据。目录是容器,可包…...
现在不流行做网站了么/推广app的方法和策略
canal新版本功能介绍:canal-admin web模块canal-server 采集数据,解析binlog 配置实例,mysql的信息canal-adapter 将数据转换为其他组件的数据源的功能。client(新版本已经可以同步kafka,es,hbase,logger,RDB,MongoDB,Redis…...
wordpress添加一言/包头整站优化
条形码和二维码(QR码)检测 文章目录 条形码和二维码(QR码)检测1、实例介绍2、静态图像检测解码3、视频流检测解码1、实例介绍 条形码和二维码在日常生活中广泛应用。本次实例将详细介绍如何从静态图像和视频流中检测、解码条形码和二维码数据。 在这里,将使用pyzbar作为条形…...