Linux的进程控制(创建和终止)

进程创建

fork

我们前面已经认识过fork函数, 用fork创建新进程后, 新建立的进程为子进程, 该进程为父进程。fork给父进程返回的是子进程的pid, 给子进程返回的是0, 出错时返回-1

进程调用fork后, 当控制转移到内核中的fork代码后, 内核做:

  • 分配新的内存块和内核数据结构给子进程
  • 将父进程部分数据结构内容拷贝至子进程
  • 添加子进程到系统进程列表当中
  • fork返回, 开始调度器调度

用fork创建子进程后如何发生写实拷贝的?

当我们在创建出子进程后, 父进程的页表中原本对应的数据区, 将会由可读可写变化为只可读(当然子进程的权限也是只可读)所以当进程需要对数据进行修改时, 就会触发操作系统的权限问题, 但是在审核的时候, 系统会发现你这个区域本来是可写的, 只是暂时变为了只可读, 所以针对这种情况, 操作系统不会当做异常处理, 而是变成操作系统把数据给你拷贝一份, 谁写的就把谁的页表映射改到新开辟的空间, 并且把权限改回可读可写然后我们就可以正常访问了

为什么要用写实拷贝的方式维护父子进程的数据区

因为我们的子进程可能只会修改父进程的一部分数据,一味的拷贝会造成内存资源的浪费也会导致效率的降低(要多拷贝一些内容)

fork的常规用法

1一个父进程希望复制自己, 使父子进程同时执行不同的代码, 例如父1进程等待客户端请求, 生成子进程来处理请求

2一个进程要处理一个不同的程序, 例如子进程从fork返回后, 调用exec函数

用fork创建多个子进程

在这里插入图片描述
子进程执行完run后就直接结束掉, 而父进程继续循环创建子进程

这多个进程谁先被执行?

这完全取决于调度器先调度谁, 父子进程以及兄弟进程谁先执行我们不可知

进程终止

为什么main函数要返回值, 这个值返回给谁了?为什么要返回这个值?

在这里插入图片描述

我们return的其实就是进程的退出码, 表征进程的退出状态。
在这里插入图片描述

0 --> success

这个退出码会被该进程的父进程拿到,(在这里就是被bash拿到)

这个退出码会被保存在?这个变量里
我们可以使用echo $?查看上一个进程的退出码
在这里插入图片描述

在进程中, 谁会关心我的进程结束状态呢?

一般而言, 是我们进程的父进程会关心

main函数的返回值本质表示:
进程完成时是否是正确的结果,如果不是可以用不同的数字,表示不同的出错原因!

strerror查看错误码信息

c语言自带的库函数strerror能将对应的错误码转化为错误信息

在这里插入图片描述
在这里插入图片描述
我们验证一下
在这里插入图片描述
我们先是用ls指令查看一个不存在的文件, 然后报错没有该文件, 我们查表发现该错误对应的错误码为2
在这里插入图片描述
查看上一个进程的退出码,发现确实是2
在这里插入图片描述

errno是c语言提供的一个全局变量, 我们调用c语言内部的库函数, 如果调用失败了, c语言会将这个默认的全局变量errno设置成对应的数字表明为什么调用出错
在这里插入图片描述在这里插入图片描述

上诉出现的错误代码都是跑完了的, 但是进程的退出还有一种情况, 那就是异常退出
对于异常退出的进程, 他的退出码还有意义吗?
因为我们不清楚异常退出的进程他是否进行了正常的return, 所以一般是不用他的退出码。

所以我们在关心进程退出的时候, 应该先关心进程是否异常, 再关心进程的退出码

我们知道了异常退出的进程, 他的退出码没有意义, 但是, 我们该如何知道进程是否是异常退出的呢?

进程异常

进程出现异常, 本质上是我们的进程收到的了对应的信号!!

信号

在这里插入图片描述

在这里插入图片描述
可以看到我们的进程在正常的跑, 并没有任何的错误

在这里插入图片描述
但是当我们在给他发送8号信号的时候, 他就发生段错误了。

所以我们父进程想要判断子进程是否是异常退出, 只需要看是否收到了对应的信号, 如果没收到, 那么自然子进程就是正常退出的, 我们此时就可以去查看子进程的退出码了

exit 与 _exit

他们两个都可以直接终止进程,并且返回对应的退出码

他们的区别是

在这里插入图片描述
如果我们是有exit()退出进程时, 这段信息是先等一会, 然后再被打印出来
(这个原因我们讲过, 是因为信息是先被保存到了缓存区, 等刷新后才会显示出来)

而如果我们使用_exit()退出进程, 会发现直接没有打印消息了所以_exit()在退出进程的时候, 是不会将缓存区里的信息刷新出来的。


_exit()是系统的调用接口, 我们用户在调用这个接口后, 就会直接将当前进程终止。

而如果我们调用的是exit()函数, 他会先把我们之前打开的各种文件啊, 流啊什么的都刷新, 然后再去调用_exit()。


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

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

相关文章

IS-IS路由

概览: Intermediate System-to-Intermediate System,中间系统到中间系统协议 IS-IS--IGP--链路状态协议--AD值:115 IS--中间系统(路由器) ES--终端系统(PC) 在早期IS-IS的开发并不是为了IP…

安防监控视频汇聚平台EasyCVR启用图形验证码之后如何调用login接口?

视频综合管理平台EasyCVR视频监控系统支持多协议接入、兼容多类型设备,平台可以将区域内所有部署的监控设备进行统一接入与集中汇聚管理,实现对监控区域的实时高清视频监控、录像与存储、设备管理、云台控制、语音对讲、级联共享等,在监控中心…

3.25号arm

1. I2C总线 1.1 i2c概述 I2C总线是PHLIPS公司在八十年代初推出的一种串行的半双工总线,主要用于连接整体电路。 I2C总线为两线制,只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。 I2C硬件结构简单,接口连接方便&…

【OpenModelica】1 OpenModelica项目架构

1 OpenModelica项目架构 文章目录 1 OpenModelica项目架构一、 架构总览图二、OpenModelica各部分作用 一、 架构总览图 OpenModelica 环境由几个相互连接的子系统组成,如图 1.1 所示。 其中包括: MDT Eclipse 插件图形模型编辑器/浏览器文本模型编辑器…

日本科技巨头富士通遭遇网络攻击,客户数据被窃

日本科技巨头富士通3月15日发布通告,宣称公司经历了一起网络攻击事件,客户个人数据已被黑客窃取。 富士通在一份通知中写道:“我们已经确认有几台商用计算机上存在恶意软件,并且经过我们的内部调查,发现包含个人信息和…

SAP前台处理:物料计价方式:价格控制与价格确定 - 02 <CKM3>

一、背景: 物料主数据中我们讲解到物料的计价方式,SAP应用到的主要计价方式有移动平均价和标准价格方式两种,但也有按照批次计价等方式,我们主要介绍最常用的V2移动平均价和S3的标准价格; 二、示例差异分析&#xff…

k8s入门到实战(二)—— windows安装minikube

minikube 安装 minikube 是一个用于在本地计算机上运行单个节点的 k8s 集群的工具。它允许开发人员可以在自己的计算机上进行本地的 k8s 开发和测试。通过minikube,您可以模拟一个完整的 k8s 集群环境,包括节点、Pod、服务和存储等组件。它是一个轻量级…

Xcode-双架构arm64 x86_64编译

要启用通用构建,在最新版本的 Xcode 中,请打开您的项目设置,然后依次选择: 1. “Build Settings” 选项卡。 2. 在顶部输入框中输入 “Architectures”。 3. 在 “Architectures” 下拉列表中选择 “Other”。 4. 在输入框中输入 …

代码随想录刷题day32|K次反转后最大的数组和加油站分发糖果

文章目录 day34学习内容一、K次反转后最大的数组和1.1、思路1.2、代码-正确写法1.2.1、如何理解if (k % 2 1) ?1.2.2、原始nums数组[2,-3,-1,5,-4],那么排序后数组等于什么? 二、加油站2.1、思路2.2、正确写法12.2.1、 如何理解上面这段代码…

数据可视化-ECharts Html项目实战(7)

在之前的文章中,我们学习了如何设置漏斗图、仪表盘。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢 数据可视化-ECharts Html项目实战(6…

JavaScript 学习日记(1)---初识JavaScript

初识JavaScript 文章目录 初识JavaScript一、JavaScript 是什么?二、java 和JavaScript 的关系三、JavaScript 的组成四、JS的基本输入输出 ---> 单行注释五、js变量基本概念六、js基本数据类型七、js转义字符八、js类型转换九、运算符 END! 一、JavaScript 是什么? 我们…

FDGaussian:又快又好的三维重建方案 | Gaussian Splatting和扩散模型超强联合

项目地址:https://qjfeng.net/FDGaussian/ 文章链接:https://arxiv.org/pdf/2403.10242 本文介绍了一种名为FDGaussian的新型两阶段框架,用于单张图像的三维重建。最近的方法通常利用预先训练好的二维扩散模型从输入图像生成可能的新视图&…

DARTS-: ROBUSTLY STEPPING OUT OF PERFORMANCE COLLAPSE WITHOUT INDICATORS

DARTS-:增加辅助跳跃连接,鲁棒走出搜索性能崩溃 论文链接:https://arxiv.org/abs/2009.01027 项目链接:GitHub - Meituan-AutoML/DARTS-: Code for “DARTS-: Robustly Stepping out of Performance Collapse Without Indicators…

RAG笔记:常见问题以及解决方法

1 内容缺失 知识库中缺少必要的上下文信息。当知识库没有包含正确答案时,RAG 系统可能会给出一个貌似合理但实际上错误的回答,而不是明确表示它不知道答案。 1.1 解决方法 1.1.1 设置阈值 在回答问题前先设定一个质量标准。如果召回内容达不到标准或…

大数据Hadoop生态圈体系视频课程

课程介绍 熟悉大数据概念,明确大数据职位都有哪些;熟悉Hadoop生态系统都有哪些组件;学习Hadoop生态环境架构,了解分布式集群优势;动手操作Hbase的例子,成功部署伪分布式集群;动手Hadoop安装和配…

真假“长文本”,国产大模型混战

文|郝 鑫 Kimi有多火爆?凭一己之力搅乱A股和大模型圈。 Kimi概念股连日引爆资本市场,多个概念股随之涨停。在一片看好的态势中,谁都想来沾个边,据光锥智能不完全统计,目前,至少有包括读客…

(二)BSQ,BIL,BIP存储格式的相互转换算法

环境:Windows10专业版 IDEA2021.2.3 jdk11.0.1 GDAL(release-1928-x64-gdal-3-5-2-mapserver-8-0-0) 系列文章: (一)PythonGDAL实现BSQ,BIP,BIL格式的相互转换 (二)BSQ,BIL,BIP存…

【中间件】docker数据卷

📝个人主页:五敷有你 🔥系列专栏:中间件 ⛺️稳中求进,晒太阳 1.数据卷(容器数据管理) 修改nginx的html页面时,需要进入nginx内部。并且因为内部没有编辑器,修改…

手把手教集成环信新版UIKit组件,快速构建Android应用

前言 环信新版UIKit已重磅发布!目前包含单群聊UIKit、聊天室ChatroomUIKit,本文详细讲解Android端单群聊UIKit的集成教程。 环信单群聊 UIKit 是基于环信即时通讯云 IM SDK 开发的一款即时通讯 UI 组件库,提供各种组件实现会话列表、聊天界…

网络编程(Internet)

网络编程三要素 在网络通信协议下,不同计算机上运行的程序,可以进行数据传输。 IP地址 要想让网络中的计算机能够互相通信,必须为每台计算机指定一个标识号,通过这个标识号来指定要接收数据的计算机和识别发送的计算机&#xf…