Linux|进程控制

进程创建

fork函数初识

在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。
返回值:子进程中返回0,父进程返回子进程id,出错返回-1
进程调用fork,当控制转移到内核中的fork代码后,内核做:

  • 分配新的内存块和内核数据结构(task_struct,mm_struct,页表等)给子进程
  • 将父进程部分数据结构内容拷贝至子进程
  • 添加子进程到系统进程列表当中
  • fork返回,开始调度器调度
    当一个进程调用fork之后,就有两个二进制代码相同的进程。而且它们都运行到相同的地方。但每个进程都将可以

当一个进程调用fork之后,就有两个二进制代码相同的进程。而且它们都运行到相同的地方。但每个进程都将可以开始它们自己的旅程

进程 = 1内核数据结构+2代码和数据
fork创建子进程的时候 是先1还是2呢?
答案是1举个例子我们去大学报名,是档案先去人后面再去

写时拷贝

通常,父子代码共享,但是数据不是是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本。

fork调用失败的原因

系统中有太多的进程
实际用户的进程超过了限制

进程终止

想明白:终止在做什么?

  • 释放代码,数据(本身就不再被调度了)和内核数据结构
  • 但是task_struct 这个内核数据结构会被延期释放,因为要返回子进程的退出信息

进程终止的情况

进程终止的情况有三种

  • 代码跑完结果正确
  • 代码跑完结果不正确
  • 异常退出
main函数的返回值

main函数的返回值,我们称为退出码,关心方要知道进程指向情况怎么。
我们可以通过ehco $?来查看最近一个进程的退出码
对于一个进程来讲 0代表成功 非0表示失败,因为成功我们就不管了,但是失败了要知道是什么情况。刚好非零的数字特别多
在这里插入图片描述
在这里插入图片描述
退出码含义:
在这里插入图片描述
bash获取最近一个进程的退出码,要知道进程的执行情况怎么样?为用户负责。

自定义退出码

在这里插入图片描述

异常退出

比如说我们解引用空指针写入数据,会发生segmentation fault(段错误)
在这里插入图片描述
在这里插入图片描述
其实本质是操作系统给进程了一个信号
我举个例子证明,下面这个代码正常情况会一直运行
在这里插入图片描述
但是我们给它一个信号他就会报段错误
在这里插入图片描述
异常的时候我们看退出信号是什么就可以判断出是什么异常了

衡量一个进程退出只需要两个数字一个退出码另一个退出信号

如何终止进程

  • main函数return 表示进程终止
  • 代码任意位置调用_exit(),exit()函数表示进程终止

_exit() 和 exit()的区别

exit()退出的时候会刷新缓冲区而_exit()不会
在这里插入图片描述
在这里插入图片描述
用_exit()的结果
在这里插入图片描述
我们可以得出一个结论缓冲区一定不在操作系统内部,因为_exit()刷新不了缓冲区
在这里插入图片描述

进程等待

任何子进程在退出的情况下,一般必须有父进程进行等待。
为什么呢?

  • 父进程通过等待解决子进程退出的僵尸问题,回收系统资源
  • 获取子进程的退出信息

进程等待的操作

wait

  • wait 父进程等待任意一个进程
    在这里插入图片描述

staus 可以得到进程的退出码和退出信号,前16位没用
后16位开始 0~7位是退出码 第8位没用 ,9~15是退出信号
对于退出码我们只需要 status右移8位 退出码只需要 按位与0x7f(二进制01111 1111)
在这里插入图片描述

WIFEXITED(status): 查看是否正常退出

若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)

WEXITSTATUS(status): 查看退出码的宏

上面位操作得到退出码 还是有点麻烦,我们可以利用系统给的宏WEXITSTATUS得到退出码
在这里插入图片描述
在这里插入图片描述

waitpid

在这里插入图片描述
waitpid 的作用是等待子进程,
参数

  • pid:pid = -1时等待任意一个进程,其他就是等待指定的一个进程
  • stat_loc 用于保存退出码和退出信号,我们不关心退出码和退出信号的时候可以把它设置为0
  • options 用于选择父进程是阻塞等待还是非阻塞等待。WNOHANG时是非阻塞等待其他是0

返回值

  • ret > 0: 检查成功
  • ret = 0: 检查成功,但子进程还在运行
  • ret< 0: 等待失败

非阻塞等待就是父进程等待的过程,可以干其他事情

非阻塞等待的例子:

在这里插入图片描述

进程替换

进程替换的函数

这些函数的参数是什么·等下再介绍,我们先来看一个现象
在这里插入图片描述

现象

我们发现运行了ls命令 之后没有运行printf了,类似于被夺舍了
在这里插入图片描述
在这里插入图片描述

原理

将进程中的代码和数据完全替换,没有创建新进程哦,
本质就是进程被加载到内存了
在这里插入图片描述

多进程版

对于单一的一个进程,进程替换了原来这个进程就直接没了,大部分场景的时候我们都不希望这样做。
本质是对代码发生了写时拷贝

execl 这些接口的参数

在这里插入图片描述

  • path:告诉要执行的文件在什么位置
  • arg*… 是可变参数,他的参数个数可以不固定,命令行怎么写就怎么传
  • 在这里插入图片描述
  • 在这里插入图片描述
    在这里插入图片描述
    带p的可以不用传文件路径了,直接在环境变量中找

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

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

相关文章

hal库定时器中断的使用

本次实验定时器3&#xff1b;验证定时器中断的回调函数功能&#xff1b; 验证方法&#xff1a; 1&#xff09;cubemx配置定时器3和串口2&#xff1b; 2&#xff09;定时器3 预分频720&#xff0c;所以72MHZ进行720分频后&#xff0c;频率为100KHZ&#xff1b;即1秒计数100000次…

Vue从入门到实战Day01

一、Vue快速上手 1. vue概念 概念&#xff1a;Vue是一个用于 构建用户界面的 渐进式 框架 构建用户界面&#xff1a;基于数据动态渲染页面渐进式&#xff1a;循序渐进的学习框架&#xff1a;一套完整的项目解决方案&#xff0c;提升开发效率 优点&#xff1a;大大提升开发效…

linux内核网络源码--通知链

内核的很多子系统之间有很强的依赖性&#xff0c;其中一个子系统侦测到或者产生的事件&#xff0c;其他子系统可能都有兴趣&#xff0c;为了实现这种交互需求&#xff0c;linux使用了所谓的通知链。 本章我们将看到 通知链如何声明以及网络代码定义了哪些链 内核子系统如何向通…

基于Springboot的校园生活服务平台(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园生活服务平台&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

如何优化工服识别算法的漏报与误报问题

背景 在一些行业&#xff0c;例如工厂、建筑工地、医院等&#xff0c;员工通常需要穿着特定的工服&#xff0c;工服有助于识别员工、保护员工免受潜在危险以及维护生产环境的清洁度。因此&#xff0c;开发工服识别算法并运用在未穿工服检测系统具有重要的实际意义。 尽管工服…

【AI知识】Stable diffusion常用提示词分享

模型&#xff08;Model&#xff09; majicmixRealistic_v7 majicmixRealistic&#xff08;麦橘写实&#xff09;是融合了多种展现日常生活人物形象的写实风格模型&#xff0c;人物的外观更加接近现实生活&#xff0c;对于光影、皮肤、人物动态均有较好的表现&#xff0c;非常…

PLC数据采集网关的功能和特点-天拓四方

一、引言 随着工业自动化程度的不断提高&#xff0c;数据在生产线上的作用愈发重要。PLC作为工业自动化的核心设备&#xff0c;其数据采集和处理能力直接影响到整个生产线的效率和稳定性。而PLC数据采集网关&#xff0c;作为连接PLC与外部系统的桥梁&#xff0c;正日益受到人们…

Photoshop 2022 for Mac/win:释放创意,打造专业级的图像编辑体验

在数字图像编辑的世界里&#xff0c;Adobe Photoshop 2022无疑是那颗璀璨的明星。这款专为Mac和Windows用户设计的图像处理软件&#xff0c;以其卓越的性能和丰富的功能&#xff0c;赢得了全球数百万创作者的青睐。 Photoshop 2022在继承前代版本强大功能的基础上&#xff0c;…

探索全新商业模式:循环购的奥秘

你是否曾经遇到过这样的疑问&#xff1a;为何有的商家会推出“消费1000送2000”的优惠活动&#xff1f;每天还有钱可以领取&#xff0c;甚至还能提现&#xff1f;这背后究竟隐藏着怎样的商业逻辑&#xff1f;今天&#xff0c;作为你们的私域电商顾问&#xff0c;我将带大家深入…

洗牌算法、蓄水池抽样算法

洗牌算法 应用场景 Link 知道数组的长度N将数组随机打散 算法实现 按照下标 i 从后向前遍历&#xff0c;在 [0, i] 随机选择一个下标 rand_idx将 arr[rand_idx] 与 random_i[i] 进行交换 代码实现 void shuffle(vector<int>& arr) {for (int i arr.size()…

使用 docker-compose 搭建个人博客 Halo

说明 我这里使用的是 Halo 作为博客的工具&#xff0c;毕竟是开源了&#xff0c;也是使用 Java 写的嘛&#xff0c;另外一点就是使用 docker 来安装&#xff08;自动挡&#xff0c;不用自己考虑太多的环境因素&#xff09;&#xff0c;这样子搭建起来更快一点&#xff0c;我们…

刷!简单的转录组分析+Cytoscape三小时工作量,思路易复现

说在前面 两样本孟德尔随机化应该大伙都了解的不少&#xff0c;不过今天看到一篇&#xff0c;有点“料”的文章&#xff0c;一句话总结&#xff1a;Cytoscape乱拳打死老师傅&#xff0c;通篇除了WGCNA、差异分析是作为常规的转录组分析方法&#xff0c;剩下的几乎都是ClueGO的…