Linux基础之进程控制--进程的创建和退出

目录

一、进程的创建

二、进程的终止

2.1 进程退出的场景

2.2 main()函数的返回值

2.3 用exit和_exit进行退出

2.4 进程异常终止


一、进程的创建

       关于一个进程是如何被创建出来的,我们已经有所介绍这里我在给大家补充些东西。
       首先,我们知道当一个子进程被父进程创建时,子进程会拷贝父进程的PCB,进程地址空间,页表等,然后跟父进程指向同一块物理地址执行接下来的代码。而如果,当我们的子进程进行写入、修改某些值时,就会触发写时拷贝,从而重新申请物理地址空间,拷贝父进程的代码,修改页表。很明显,这一过程我们用户是不知道的,也就是说这一切都是操作系统自行完成的。
        那写时拷贝这一过程是怎么实现的呢?这里先来给大家初步的说明一下:当我们的父进程创建子进程时,会将自己的读写权限修改成只读,然后在创建我们的子进程。用户并知道这一点,那我们的用户就可能对某一批数据进行写入!那么我们的页表就会因为权限问题而出错(这里出错会有两个原因---1、是真的出错了---2、不是真的出错,是触发我们进行重新申请内存拷贝内容的策略机制),那么我们的OS就会进行介入,从而进行我们的写时拷贝。也就是说我们通过将内容权限修改成只读,就可以触发异常,从而让OS来介入处理,达到写时拷贝的目的。这里上一张图,来加深大家的理解:

二、进程的终止

2.1 进程退出的场景

       要想认识进程的终止,我们首先就要先清楚进程是什么时候退出的呢,或者说会在哪些场景下退出呢?

  • 代码运行完毕,结果正确
  • 代码运行完毕,结果不正确
  • 代码异常终止

       以上就是进程退出的场景。一个进程运行完毕无非就是两种结果,一是结果正确,二是结果错误。还有一种特殊的情况就是代码一场终止了。那么接下来我们就需要明确一个概念,在我们多进程环境中,我们创建子进程的目的是什么?
        当然是去帮我们干事,那么子进程把事情办的怎么样呢?(我们需要知道),同样其父进程也需要知道。 那么我们的父进程该怎么去知道我们的子进程完成的怎么样呢?根据子进程的返回值。说到这里,我们就可以来说一说,我们的main()函数了。

2.2 main()函数的返回值

       其实我们的main()函数也是有返回值的,因为其最终也会是一个进程,像我们每次写代码在main中都会有的return 0。这个0就是我们main()函数的返回值,也可以叫做该main()函数所在进程的退出码。
       其中 0 表示success而 !0 则表示的是 Failed----光知道进程失败肯定是不够的,我们肯定还需要知道我们的进程是因为什么而失败的,所以我们就可以用1、2、3....这些不同的数字来表示不同的退出原因,也就是说我们返回什么都可以,只是不同的值会代表不同的涵义。
       而我们的父进程通过获取子进程的退出码,来判断子进程的运行结果。

       那么返回 1,2,3...这些值都代表着什么呢?这里就需要提到我们的老朋友了--strerror这个函数让我们先通过定义来回顾一下这个函数吧。​
​​​​​​
其可以将错误码转换成对应的错误信息,那么接下来让我们通过实操看看到底都有些什么错误信息吧。同样,我们先写一段代码:

让我们看看结果:

可以看到有非常多的结果,不过也不是无穷无尽的,在133之后是没有有效信息的。当然这些错误信息我们还可以自己进行定义。

这里提及一个指令,可以查看最近一个进程的退出码。

echo  $?  // ?这个环境变量中就是保存着最近一个进程执行完毕时的退出码

2.3 用exit和_exit进行退出

我们可以通过man这个指令先简单的看一下这个指令

       可以发现其是我们 <stdlib.h> 库里的一个函数,其作用也是使我们的进程退出,同样会返回一个值。那它和我们的return比较又有什么区别呢。

  • 在main()函数中直接进行直接return,表示的是该进程的退出,返回退出码。

  • 在其他函数中进行return,表示的是函数的调用结束。

  • 但是exit不同,在任意地点调用都表示进程的退出,不进行后续执行。

       这里我们同样可以用 echo $? 去获取该进程的退出码。那么这个_exit又是个什么东西呢,它与exit的区别又在哪里呢?那就先查一查手册吧:

可以发现其大致的功能是和exit是一致的,那他们的区别是什么呢?让我们通过实际运用来观察,先写一段代码:

这一段代码的结果是这样的:

让我们在试试_exit:

       修改了,我们会发现,我们的hello world 没有了,这是为什么呢?相信细心的读者已经发现了我在这段代码中并没有刷新我们的缓冲区,也就是说我们的exit是会帮助我们刷新缓冲区的,而我们的_exit却不会,这就是他们的区别,这也就说明我们目前所知道的缓冲区,绝对不在操作系统内部!!。
       在更深一点理解,就是exit 是库函数,而_exit是系统调用,也就是说,其实我们的exit可以简单的认为是对我们的系统调用进行的一个封装。关于这点,我们之后再详细说明。

2.4 进程异常终止

        一个进程如果异常终止了,其实进程还会返回一个值,这个值就是信号,信号为0表示没有异常,为其他值,就表示发生了异常。发生异常,退出码就没有意义了。

        那么,哪些情况会导致我们的进程异常呢?比如说:我们主动通过信号来杀死该进程导致其异常终止;或者访问空指针;数组越界等等。

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

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

相关文章

python之tkinter学习笔记

目录 Widget概览 加强版的tkinter模块 一、通用的 1.1、Label PhotoImage (gif图片加载) jpg图片加载 config方法-计时器 1.2、PanedWindow 1.3、LabelFrame 二、tkinter专有 2.1、Menu菜单复选框 2.2、工具栏 三、tkinter.ttk专有 3.1、Separator分隔线 3.2、n…

【C++】C++ 宾馆酒店管理系统(源码+数据+论文)【独一无二】(史上功能最全,拿来即用)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

LeetCode-47. 全排列 II【】

TOC 题目描述&#xff1a; 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2] 输出&#xff1a; [[1,1,2], [1,2,1], [2,1,1]] 示例 2&#xff1a; 输入&#xff1a;nums [1,2,3] 输…

InnoDB Data Locking - Part 2.5 “Locks“ (Deeper dive)

All together now 现在让我们把在 InnoDB Data Locking – Part 2 “Locks” 中学习到的有关表锁和记录锁的知识结合起来&#xff0c;以理解以下情况&#xff1a; 我们看到&#xff1a; 第一个 SELECT * FROM t FOR SHARE; 在 5、10、42 和 supremum 伪记录上创建了 S 锁。…

【软件设计师】2022年上半年真题解析

​​冯诺依曼计算机体系结构的基本特点是&#xff1a; A. 程序指令和数据都采用二进制表示 - 这是正确的&#xff0c;因为冯诺依曼架构下的计算机使用二进制形式来表示和处理所有信息&#xff0c;包括指令和数据。 B. 程序指令总是存储在主存中&#xff0c;而数据则存储在高速…

Discuz_X3.5各行业资料文档下载模板

下载地址&#xff1a;Discuz_X3.5各行业资料文档下载模板

验证外星语词典

在解决算法题时&#xff0c;哈希表是经常被使用的工具&#xff0c;可以用来记录字符串中字母出现的次数&#xff0c;字符串中字符出现的位置等&#xff0c;这里用到的就是利用哈希表储存字符串中字符出现的的位置。 “外星语”的字母表顺序是不一样的&#xff0c;所以…

python数据预处理

PYTHON 最流行库&#xff1a;Numpy、Matplotlib 和 Pandas。Numpy 是满足所有数学运算所需要的库&#xff0c;由于代码是基于数学公式运行的&#xff0c;因此就会使用到它。Maplotlib&#xff08;具体而言&#xff0c;Matplotlib.pyplot&#xff09;则是满足绘图所需要的库。Pa…

创建一个支持切换阅读模式和答题模式的Anki问答题模板

为了备考某个需要默写的科目&#xff0c;做了个问答题笔记模板&#xff0c;如下&#xff1a; 在上图的回答栏填写答案后&#xff0c;点击显示答案按钮转到背面&#xff1a; 只实现上面的功能是很简单的&#xff0c;直接基于Anki自带的问答题模板添加自己需要的字段即可。问题…

嵌入式工程师人生提质的十大成长型思维分享

大家好,作为一名嵌入式开发者,很多时候,需要考虑个人未来的发展,人生旅途复杂多变,时常面临各种各样的挑战。如何在这个复杂多变的社会中稳步向前,不断成长,成为每个人都应该思考的问题。实际上,思维方式的差异决定我们应对挑战的能力与成长的速度。 第一:寻找自我坐…

Linux CPU占用高问题

1、top命令和历史系统监控找出持续占用CPU的top5进程。 # top -c 依次按键盘键b->x&#xff0c;按照CPU由高到底排序。shiftP和shiftM切换使用CPU和内存的排序 # top -Hp pid 查看进程中所有线程的占用情况 # top -Hp 1124 -n 1 -b | awk {print $NF} | sort | uniq -c |…

Python | 自动探索性数据分析(EDA)库SweetViz

SweetViz是一个开放源代码Python库&#xff0c;主要用于生成精美的高密度可视化文件&#xff0c;启动探索性数据分析&#xff08;EDA&#xff09;&#xff0c;输出为完全独立的HTML应用程序。 探索性数据分析&#xff08;EDA&#xff09;是分析和总结数据集主要特征的过程&…

pytorch学习笔记5

transform 本质上作用是将图片通过transform这个这个工具箱获取想要的结果 tensor就是一个包含神经网络需要的一些理论基础的参数 from torch.utils.tensorboard import SummaryWriter from torchvision import transforms from PIL import Image #tensor数据类型 #通过tra…

Linux系统上的磁盘扩展总结

目录 一、前言 二、相关基础知识 &#xff08;1&#xff09;术语理解 &#xff08;2&#xff09;相关命令学习 1、磁盘管理相关命令 2、LVM管理相关命令 三、磁盘操作场景汇总 &#xff08;1&#xff09;添加新硬盘后挂载到已有目录进行扩容 &#xff08;2&#xff09…

Python 二叉数的实例化及遍历

首先创建一个这样的二叉树&#xff0c;作为我们今天的实例。实例代码在下方。 #创建1个树类型 class TreeNode:def __init__(self,val,leftNone,rightNone):self.valvalself.leftleftself.rightright #实例化类 node1TreeNode(5) node2TreeNode(6) node3TreeNode(7) node4Tre…

【数据结构与算法】七大排序算法(下)

【数据结构与算法】七大排序算法(下) &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;数据结构与算法&#x1f345; &#x1f33c;文章目录&#x1f33c; 2.3 交换排序 2.3.1 冒泡排序 2.3.2 快速排序 2.3.3 快速排序(非递归) 2.4 归并…

【一刷《剑指Offer》】面试题 30:最小的 k 个数

牛客对应题目链接&#xff1a;最小的K个数_牛客题霸_牛客网 (nowcoder.com) 力扣对应题目链接&#xff1a;LCR 159. 库存管理 III - 力扣&#xff08;LeetCode&#xff09; 核心考点 &#xff1a; topK 问题。 一、《剑指Offer》内容 二、分析题目 1、排序&#xff08;O(Nlo…

数据结构之二叉搜索树(TreeSetTreeMap)

目录 一.搜索树 1.1概念 1.2适用场景 2.二叉搜索树的基本操作 2.1二叉搜索树的定义 2.2查找 2.1.1基本思路 2.3插入 2.3.1基本思路 2.4删除 2.4.1基本思路 2.5遍历 2.6性能分析 二.TreeSet Map和Set 1.概念 2.模型 1.定义 2.基本操作 三.TreeMap 1.定义 2.基…

C语言笔记第9篇:字符函数和字符串函数

在编程的过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了方便操作字符和字符串&#xff0c;C语言标准库中提供了一系列库函数&#xff0c;接下来我们就学习一下这些函数。 一、字符函数 1、字符分类函数 C语言中有一系列的函数是专门做字符分类的&#xff0c;…

MyBatis一、MyBatis简介

MyBatis一、MyBatis简介 MyBatis 简介MyBatis 定义MyBatis 历史MyBatis 特性1. 灵活性和易用性2. 性能优化3. 易于集成4. 支持多种数据库5. 插件机制6. 其他特性 MyBatis 下载和其他持久化层技术对比 MyBatis 简介 MyBatis 定义 MyBatis 是一个优秀的持久层框架&#xff0c;它…