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.mzph.cn/diannao/10882.shtml

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

相关文章

Spring底层入门篇-前言

从2024-04-13至2024-05-12&#xff0c;历时一个月时间&#xff0c;Spring底层入门篇全部完成&#xff0c;共计十一篇。该系列的定位是&#xff1a;主线取材于B站某马的教学视频&#xff0c;再加上个人的理解的学习笔记。 该系列的原标题是Spring高级篇&#xff0c;但是在某一天…

AVL 树的理解和简单实现

目录 1. AVL 树 1.1. AVL 树的概念 1.2. AVL 树的性质 2. AVL 树的框架如下 2. AVL树的 插入 2.1. 平衡因子的更新 2.2.1. 平衡因子更新的第一种情况 2.2.2. 平衡因子更新的第二种情况 2.2.3. 平衡因子更新的第三种情况 2.2.4. 平衡因子更新的代码框架如下 2.2. AV…

《C++学习笔记---初阶篇6》---string类 上

目录 1. 为什么要学习string类 1.1 C语言中的字符串 2. 标准库中的string类 2.1 string类(了解) 2.2 string类的常用接口说明 2.2.1. string类对象的常见构造 2.2.2. string类对象的容量操作 2.2.3.再次探讨reserve与resize 2.2.4.string类对象的访问及遍历操作 2.2.5…

5KVA电力高频逆变器DU5000HD不间断电源DU3000HD

UPS电力高频逆变器DU3000HD不间断电源模块DU5000HD&#xff0c;单机版2KVA逆变电源DU2000HD&#xff0c;并机版2KVA逆变器DU2000H&#xff0c;3KVA逆变装置DU3000H&#xff0c;DU5000H&#xff0c;IV2000HD-2&#xff0c;IV3000HD-2&#xff0c;IV5000HD-2&#xff0c;IV2000H-…

基于51单片机音乐倒计时倒数计数器设计( proteus仿真+程序+设计报告+原理图+讲解视频)

基于51单片机音乐倒计时设计( proteus仿真程序设计报告原理图讲解视频&#xff09; 仿真图proteus7.8及以上 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0090 1. 主要功能&#xff1a; 基于51单片机的音乐倒计时器设计 设计内…

清醒脑科学,摆脱杂念/拧巴内耗

参考视频&#xff1a;【清醒脑科学】内耗/拧巴/杂念难止&#xff1f;你需要头脑的一键重启_哔哩哔哩_bilibili Part1&#xff1a;思维矛盾的真相 1. 信息量不足&#xff1a;就推测答案&#xff0c;因不定态导致的内耗 大脑觉得这个问题很重要&#xff0c;于是过度的紧张情绪&…

47.乐理基础-音符的组合方式-连线

连线与延音线长得一模一样 它们的区别就是延音线的第三点&#xff0c;延音线必须连接相同的音 连线在百分之九十九的情况下&#xff0c;连接的是不同的音&#xff0c;如下图的对比&#xff0c;连线里的百分之1&#xff0c;以现在的知识无法理解&#xff0c;后续再写 在乐谱中遇…

解决在C#中方向键对控件焦点的控制

不要犹豫直接把下面这个程序复制进去就好了&#xff0c;不用担心0个引用&#xff0c;哈哈&#xff0c;可以的 public partial class MainForm : Form {public MainForm(){InitializeComponent();}protected override bool ProcessDialogKey(Keys keyData){// 检查是否是方向键…

Spring Boot 自动装配

本篇主要介绍Spring Boot 自动装配的相关内容。 目录 一、什么是自动装配 二、Bean的扫描方式 ComponentScan Import ImportSelector接口 三、Spring Boot自动装配原理 一、什么是自动装配 在我们在创建Spring Boot项目时往往会根据项目需求&#xff0c;引入很多第三方…

OpenCV 轮廓提取总结

0.概述 对于轮廓提取&#xff0c;opencv提供了相关的函数&#xff0c;本文对其使用方法及相关变体做总结。

本地vite启动的vue项目使用nginx代理

前提&#xff1a; 必须在同一网段或者相同的局域网&#xff01;&#xff01;&#xff01; nginx下载通道&#xff1a; https://nginx.org/en/download.html 步骤&#xff1a; 1、最好下载稳定版本&#xff1a; 2、下载后直接解压&#xff08;注意&#xff1a;解压后不要放…

利用PS在不伤背景的前提下根据颜色去除图像上不想要的内容

下面为一个例子&#xff0c;去除图像上红色的虚线 Step1.用套索工具框选带有颜色的部分 Step2.切换到魔术棒工具&#xff0c;上端选项中&#xff0c;点击与选区交叉&#xff0c;连续这一项不要勾选 Step3.在需要去除的部分点击一下即可在框选范围内选中所有同颜色的区域&#x…

零基础学MySQL

1. 零基础学MySQL 1.1 数据库简介 1.1.1 数据库三层结构 1. 所谓安装Mysql数据库&#xff0c;就是在主机安装一个数据库管理系统(DBMS)&#xff0c;这个管理程序可以管理多个数据库。DBMS(database manage system) 2. 一个数据库中可以创建多个表,以保存数据(信息)。 3. 数据…

安卓手机APP开发__支持不同的平台版本

安卓手机APP开发__支持不同的平台版本 目录 概述 指定最小的和目标的API的级别 检查运行时的系统版本 使用平台的风格和主题 概述 当安卓的最新的版本为你的APP提供了很好的API,你应该继续支持安卓的旧版本, 直到更多的设备已经升级为安卓的新版本了.这里展示了你如何利用…

手写Windows文件路径获取小工具

手写Windows文件路径获取小工具 目的 给Windows右键增加功能&#xff0c;右键任何文件&#xff08;夹&#xff09;显示复制文件路径的扩展。 效果展示 实现思路 右键调用&#xff0c;自身会把文件路径传递给被调用文件&#xff0c;被调用文件内只需将路径参数复制到剪贴板即…

JavaSE面向对象

面向对象&#xff1a; 所谓面向对象它是针对于面向过程来说的&#xff0c;面向过程是在意执行的流程。而面向对象在意的功能。将一系列的过程封装到一个容器中&#xff0c;我们通过操作这个容器即以对象的方式来进行操作就是面向对象。 类&#xff1a; 类是一类事物的总称&a…

个人微信api

简要描述&#xff1a; 退出群聊 请求URL&#xff1a; http://域名地址/quitChatRoom 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/json Authorization&#xff1a;login接口返回 参数&#xff1a; 参数名 必选 类型 …

中国当代最具影响力的人物颜廷利:死神(死亡)并不可怕,可怕的是…

中国当代最具影响力的人物颜廷利&#xff1a;死神&#xff08;死亡&#xff09;并不可怕&#xff0c;可怕的是… 在中国优秀传统文化之中&#xff0c;汉语‘巳’字与‘四’同音&#xff0c;在阿拉伯数字里面&#xff0c;通常用‘4’来表示&#xff1b; 作为汉语‘九’字&#x…

docker(二):Centos安装docker

文章目录 1、安装docker2、启动docker3、验证 官方文档&#xff1a;https://docs.docker.com/engine/install/centos/ 1、安装docker 下载依赖包 yum -y install gcc yum -y install gcc-c yum install -y yum-utils设置仓库 yum-config-manager --add-repo http://mirrors…

Python面试题【python基础部分1-50】

Python面试题【python基础部分1-50】 Python面试题【python基础部分1-50】 Python面试题【python基础部分1-50】 问题&#xff1a;如何在Python中交换两个变量的值&#xff1f; 答案&#xff1a; a, b b, a问题&#xff1a;Python中的列表和元组有什么区别&#xff1f; 答案&…