Linux——进程控制(一)进程的创建与退出

目录

一、进程创建

1.写时拷贝

2.创建多个进程

二、进程终止

1.main函数的返回值

2.bash中的$? 

3.自定义退出码

4.C语言的错误码

5.错误码与退出码的区别

6.代码异常终止

7.exit函数

8.总结


一、进程创建

在之前,我们学过linux中的非常重要的函数——fork。他可以从已存在进程中创建一个新进程,新进程为子进程,而原进程为父进程

1.写时拷贝

我们知道,fork之后,父子代码共享,经常会出现同一个变量,父子通过操作的不同,这个变量的值也不同,这个时候就会发生写时拷贝。写时拷贝是如何进行的呢?

通过这张图可以看到,fork之后数据段变成了只读, 子进程需要对数据进行写入,就得需要写时拷贝,写时拷贝需要重新申请空间,进行拷贝,再修改页表,这都是操作系统在帮我们处理的,那么操作系统怎么知道你这一份数据需要进行写时拷贝呢?

父进程创建子进程的时候首先将自己的读写权限修改成只读,然后再创建子进程,这些操作用户并不知道,可能对某些数据进行写入,这样在页表处就会进行权限判断,发现用户没有权限,操作系统此时就会介入,操作系统会判断用户的操作

如果该区域本该是可读可写的,是操作系统修改为只读的,因此操作系统会认为用户的操作不算错误,就会触发重新申请内存再拷贝内容的策略机制,这就是写时拷贝。

如果出错,就直接报错,不做额外处理。

写时拷贝完成后,再将对应的内容在页表中修改为可读可写(没有进行写实拷贝的内容依然是只读的)。这样用户就可以正常访问了。

这是一种惰性分离,每次发生写时拷贝都要开辟空间,将写时拷贝的时间越往后延迟,操作系统就有更多的资源


这里还有一个小问题:你要写入的时候写就完事了,为何还要拷贝一份呢?

因为覆盖和修改是不一样的,很多情况,我们只是想要修改内容的某一部分,这样先拷贝再修改会更合适一点。

2.创建多个进程

我们知道fork的常规用法如下两种

  • 一个父进程希望复制自己,使父子进程同时执行不同的代码段。例如,父进程等待客户端请求,生成子 进程来处理请求。
  • 一个进程要执行一个不同的程序。例如子进程从fork返回后,调用exec函数。

如果要创建多个进程来帮我们处理,应该怎么做呢?  直接上代码

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>#define N 10typedef void (*callback)();void Work()
{int cnt = 10;while(cnt){printf("我是一个子进程, pid: %d, ppid :%d, cnt:%d\n",getpid(),getppid(),cnt--);sleep(1);}
}void CreateProcess(int n,callback cb)
{int i = 0;for(;i<n;i++){sleep(1);pid_t id = fork();if(id == 0){//child                                                                    printf("子进程创建成功: %d\n",i);cb();exit(0);}}
}int main()
{CreateProcess(N,Work);sleep(100);return 0;
}

这代码对于学过fork的我们来讲,并不算难,多了一个函数指针而已,下面是运行代码。

二、进程终止

进程退出的场景如下三种

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

1.main函数的返回值

我们写C语言程序时,main函数一般都会return 0。只要执行到了return语句,证明我们的代码肯定是运行完毕了的,只是结果还不知道是否正确

在多进程环境中,我们创建子进程的目的是完成父进程不方便办的事,那我们怎么知道子进程办得怎么样,虽然我们可以打印出来看看结果,但在有一些情况下不方便或者不能打印出来看看,此时就可以通过return的值来查看的,main函数的返回值,就叫做进程的退出码,0通常表示成功,非0表示失败。父进程可以通过获取子进程退出码(即main函数的返回值)来得知子进程做得咋样。

成功的还好,知道你吧事情办得很好,如果返回非0,代表这个事没办好,我们得知道是因为什么原因失败的,我们可以用不同的数字表示不同的原因。但纯数字能表示出错的原因,但是不便于人阅读,因此有一个函数交 strerror 函数。

如下可以打印出strerror各个数字代表的出错原因

有很多很多原因 

2.bash中的$? 

在bash命令中输入echo $? 可以打印出最近一个子进程执行完毕时的退出码,有点类似于之前我们学习的环境变量,变量名为?,加了$可以打印出变量里的内容。

如下代码中return 10,执行该进程,bash最后获取到的子进程退出码就为10

但是我们继续执行echo $? 后面退出码就会变成0,因为echo也是bash的一个子进程,执行echo语句后,echo语句就是最后一个子进程了,echo又是正常退出的,因此再输入echo $? 得到的值为0。

main函数的退出码是可以被父进程获取的,用来判断子进程的运行结果 

3.自定义退出码

退出码可以使用C语言内置的,也可以自定义,自己对退出码做解释,因为退出码退出多少(也就是return 返回多少是你自己设置的) 

如下就是自定义的退出码,如果你的代码根据用户的操作出现了错误,可以返回响应的值,来知道发生了什么错误。

4.C语言的错误码

在学习C语言的时候,我们接触过一个名叫 errno 的全局变量,他会在程序在运行过程中调用某些库函数或者系统接口出错的时候,被自动设置。也是记录最后一次出错的信息。

如下代码,只读的方式打开一个不存在文件,我们看一下erron的变化与出错信息

发现错误码为2,错误信息为没有该文件

5.错误码与退出码的区别

  • 错误码通常是衡量调用库函数或者系统调用接口的调用情况。(系统调用也能更改错误码是因为Linux是用C语言写的,提供了C式接口)
  • 退出码通常是一个进程退出的时候,他的退出结果。

他们两个共同的地方在于当失败的时候,用来衡量函数、进程出错时的详细原因。

如下,让错误码与退出码保持了一致

6.代码异常终止

前面五点主要学习的是进程正常退出的问题,可能会有出错码和退出码,如果一个进程异常终止,那么他的退出码也就没有了意义

比如代码中存在 /0 错误,又比如段错误,栈溢出等等,程序就会崩溃,进程就异常了,就不会继续运行了,本质是操作系统将该进程杀掉了,操作系统会用信号的方式将进程杀掉。

输入 kill -l 可以查看 kill命令的信号 

这里我们一直运行一个进程,然后输入kill -8 + 进程pid,就可以通过浮点数错误的方式终止该进程。输入其他方式杀死,也会有相应的错误报告。 

 因此,查看进程是否出现异常,我们只需看有没有收到信号即可

7.exit函数

C语言退出函数 exit() ,括号内部可以添加数字,这也是退出码的一种。 

exit与return的区别在于

在非main函数中return 并不会终止进程,main函数会终止进程。

在任意函数中exit都会终止进程。

8.总结

查看进程运行完毕,结果是否正确,只需要看退出码即可

查看进程异常终止,只需要查看收到的信号是什么即可。

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

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

相关文章

速卖通店铺营销秘籍:如何巧妙运用活动提升转化率

对于速卖通卖家而言&#xff0c;想要提升店铺的成交率&#xff0c;除了依赖付费推广外&#xff0c;更重要的是如何通过店铺营销来吸引和留住潜在买家。今天&#xff0c;我们就来深入探讨一下速卖通店铺营销的几个关键策略。 首先&#xff0c;我们要明确一点&#xff0c;速卖通平…

IDEA中的Structure模块使用详解

IDEA中的Structure模块使用详解 类方法的展示 从左往右介绍&#xff1a; 1、最开头的 m 标识是表示为方法&#xff0c;如出现 f 标识则表示为属性&#xff1b; 2、m后面跟着的是方法或者属性的访问修饰符&#xff1a; #红色关闭的锁表示为private&#xff1b; #圆圈表示不带…

使用Docker搭建一款实用的个人IT工具箱——It-Tools

作为程序员&#xff0c;在日常工作中&#xff0c;需要借助一些工具来提高我们工作效率&#xff0c;IT-Tools是为开发人员度身打造的一套便捷在线工具。它提供全面功能&#xff0c;使开发者能以更高效方式完成任务。经由IT-Tools&#xff0c;开发人员能轻松应对各类技术挑战&…

qt QRadioButton 及QButtonGroup 使用

QRadioButton 放在组合框QGroupBox中&#xff0c;再点击时&#xff0c;即使有多个QRadioButton按钮&#xff0c;同时选中的也就只有一个。 如下图所示&#xff0c; 对于多个QRadioButton&#xff0c;每个按钮都写一个槽函数是不太明智的选择&#xff0c;需要将QRadioButton放在…

「MySQL」增删查改

在操作数据库中的表时&#xff0c;需要先使用该数据库&#xff1a; use database;新增 创建表 先用 use 指定一个数据库,然后使用 create 新增一个表 比如建立一个学生表 mysql> use goods; mysql> create table student(-> name varchar(4),-> age int,-> …

IIS部署.Net 7项目

&#x1f468; 作者简介&#xff1a;大家好&#xff0c;我是Taro&#xff0c;前端领域创作者 ✒️ 个人主页&#xff1a;唐璜Taro &#x1f680; 支持我&#xff1a;点赞&#x1f44d;&#x1f4dd; 评论 ⭐️收藏 文章目录 前言一、发布项目二、解决发布失败1.发布失败2.托管…

深入理解计算机系统笔记

1.1 嵌套的数组 当我们创建数组的数组时&#xff0c;数组分配和引用的一般原则也是成立的。 例如&#xff0c;声明 int A[5][3]; 等价于下面的声明 typedef int row3_t[3]; row3_t A[5] 要访问多维数组的元素&#xff0c;编译器会以数组起始为基地址&#xff0c; (可能需…

【Ai生态开发】Spring AI上架,打造专属业务大模型,AI开发再也不是难事!

大家好 这里是苏泽 后端是工作 ai是兴趣 对于ai的产生我的立场是拥抱ai的 是希望拿他作为提升能力的工具 那么这一篇带大家来学习如何使用ai打造一个专属的业务大模型 需求 就是说假设现在有一个 商城系统 里面有查询订单的api和获取商品购买方式的api 用户只需要输入 “…

C++二叉搜树的实现(递归和非递归)

目录 1.什么是二叉搜索树 2.二叉搜索树的查找 3.二叉搜索树插入 4.二叉搜索树的删除 1.删除的节点只有左子树或者右子树 2.删除节点左右子树都有的情况 5.代码 1.什么是二叉搜索树 左节点的值小于根节点 右节点大于根节点 左右子树也满足上面两个条件 例&#xff1a;…

平台工程与安全

平台工程不是为了取代DevOps&#xff0c;而是DevOps的进一步演进和发展。本文介绍了DevOps和平台工程&#xff0c;以及对于安全的意义。原文: Platform Engineering and Security: A Very Short Introduction 中国云南大理的日落 我是一名 DevOps 工程师&#xff0c;个人还是希…

Android WebView访问网页+自动播放视频+自动全屏+切换横屏

一、引言 近期&#xff0c;我发现电视家、火星直播等在线看电视直播的软件都已倒闭&#xff0c;而我奶奶也再无法通过这些平台看电视了。她已六十多岁&#xff0c;快七十岁啦。这些平台的倒下对我来说其实没有多大的影响&#xff0c;但是对于文化不多的她而言&#xff0c;生活中…

蓝桥杯算法 一.

分析&#xff1a; 本题记录&#xff1a;m个数&#xff0c;异或运算和为0&#xff0c;则相加为偶数&#xff0c;后手获胜。 分析&#xff1a; 369*99<36500&#xff0c;369*100>36500。 注意&#xff1a;前缀和和后缀和问题

【wpf】关于绑定的一点明悟

背景简介 软件功能为&#xff0c;读取一个文件夹下的所有子文件夹&#xff0c;每个文件夹对自动对应生成 一组 “按键四个勾选” 按键点击触发&#xff0c;可以发送与其对应文件夹中的一些内容。这个绑定的过程我在之前的文章有过详细的介绍&#xff0c;非常的简单。 这里回顾…

mac jupyter使用现有的python环境

mood&#xff1a;python 编程真的是在反复的与自己和解啊 本来超级的畏难情绪 读会儿书 计算机博士的书 感觉还是要坚强的。《研磨记》--一位博士生的回忆录 作者技术真的强啊 正文开始&#xff1a; 聚焦搜索&#xff0c;打开终端激活虚拟环境&#xff1a;conda activate pyt…

外汇天眼:ASIC 获得针对前 Blockchain Global 董事的临时出行限制令

澳大利亚证券与投资委员会&#xff08;ASIC&#xff09;已经针对前Blockchain Global Limited&#xff08;清算中&#xff09;董事梁国&#xff08;又名Allan Guo&#xff09;获得了临时旅行限制令。这些命令在其他方面&#xff0c;阻止郭先生在2024年8月20日或进一步命令之前离…

(done) 如何计算 Hessian Matrix 海森矩阵 海塞矩阵

参考视频1&#xff1a;https://www.bilibili.com/video/BV1H64y1T7zQ/?spm_id_from333.337.search-card.all.click 参考视频2&#xff08;正定矩阵&#xff09;&#xff1a;https://www.bilibili.com/video/BV1Ag411M76G/?spm_id_from333.337.search-card.all.click&vd_…

windows安装部署node.js以及搭建运行第一个Vue项目

一、官网下载安装包 官网地址&#xff1a;https://nodejs.org/zh-cn/download/ 二、安装程序 1、安装过程 如果有C/C编程的需求&#xff0c;勾选一下下图所示的部分&#xff0c;没有的话除了选择一下node.js安装路径&#xff0c;直接一路next 2、测试安装是否成功 【winR】…

华为OD机试真题-智能成绩表-2023年OD统一考试(C卷)---Python3--开源

题目&#xff1a; 考察内容&#xff1a; sort(双排序&#xff09; if dict(keys;items()) 代码&#xff1a; """ analyze:input: int n 学生人数&#xff1b; int m 科目数量 科目名称&#xff08;不重复&#xff09; 人名(不会重名&#xff09; 科目成绩 …

Python 在Word中查找并高亮指定文本

当你需要在长文档或报告中快速找到特定的关键词或短语&#xff0c;Word中提供的查找并高亮这一功能可以帮助你迅速定位这些内容。本文将介绍如何使用Python在Word中查找并突出显示指定的文本。 所需工具&#xff1a;第三方库 Spire.Doc for Python。该库支持创建、编辑、转换Wo…

HDL FPGA 学习 - FPGA基本要素,开发流程,Verilog语法和规范、编写技巧

目录 Altera FPGA 基本要素 FPGA 开发流程和适用范围 设计和实施规范 顶层设计的要点 Verilog HDL 语法规范 编写规范 设计技巧 编辑整理 by Staok&#xff0c;始于 2021.2 且无终稿。转载请注明作者及出处。整理不易&#xff0c;请多支持。 本文件是“瞰百易”计划的…