Linux进程控制篇

1. 进程创建


fork()函数创建一个进程:

  • 父进程返回子进程的pid
  • 子进程返回0

创建进程后,我们希望子进程做的事有两种:

  • 子进程帮父进程完成同样的工作
  • 子进程干其他任务

进程 = 内核的相关管理数据结构(tack_struct + mm_struct + 页表) + 代码和数据

由于进程具有独立性,父子进程的内核数据结构各自独有一份;代码是可读的,父子共享;数据根据写时拷贝,分配给子进程

fork创建子进程其实是:

  1. 分配新的内存块和内核数据结构给子进程
  2. 将父进程的内核数据结构拷贝给子进程
  3. 将子进程添加到系统进程列表当中
  4. fork函数返回

一个进程,在内存中,先有它的内核数据结构,再有它的数据和代码

2. 进程终止


进程终止是在做什么?

  • 释放掉代码和数据占据的内存空间
  • 释放掉内核数据结构

进程终止的三种情况:

  • 代码跑完,结果正确
  • 代码跑完,结果不正确
  • 代码没跑完,中途出现异常

main 函数中,return 的值实际上是进程的退出码,交给父进程;父进程根据退出码判断进程结果正不正确,为0表示正确,!0表示不正确;我们可以自己设置,也可以直接使用系统的

在这里插入图片描述

使用 echo $? 查看最近一次进程的退出码

父进程为什么要得到子进程的退出码?

父进程创建子进程是为了帮自己完成任务,子进程任务结束,父进程就得知道任务的结果是怎样的;要知道子进程退出的情况(成功或失败,失败的原因是什么)

当然,进程也有可能中途出现异常,提前退出;比较常见的情况是,用vs编译代码时,程序崩溃了,原因是OS发现你做了不该做的事,OS杀掉了进程

进程出异常,本质是进程收到了OS发出的信号;进程异常退出的时候,可以查看退出信号,就能知道异常的原因是什么

  • 进程终止时,只要查看两个变量,退出码和退出信号就能知道进程终止的原因
  • 判断一个进程退出是否正常,先看退出信号,再看退出码

在这里插入图片描述

进程终止时,会设置自身的退出码和退出信息,等待父进程读取

如何终止进程?

  • return:main函数 return 表示进程退出,函数 return 表示函数退出
  • exit函数(库函数):在程序的任意位置使用 exit 函数,都表示进程退出
  • _exit函数(系统接口):与exit函数同理

exit 与 _exit 不同的是,前者会冲刷缓冲区,后者不会;也告诉了我们,缓冲区在系统层之上,因为 exit 底层也是调用 _exit

3. 进程等待


任何子进程,在退出前,都要被父进程等待;子进程退出后进入Z状态,如果父进程不管不顾,会有内存泄漏

父进程为什么要等待?

  • 父进程通过等待,解决子进程的僵尸问题,回收系统资源,防止内存泄漏
  • 获取子进程的退出码和退出信号,知道子进程为什么退出

父进程如何等待?

在这里插入图片描述

在这里插入图片描述

子进程的退出码和退出信号,最总还要我们进行位操作才能拿到,太麻烦了,有没有简单的方式拿到子进程的退出码和退出信号?

使用宏WITEXITED(status)来判断进程是正常退出还是异常退出;如果为真,则正常退出,使用宏WEXITSTATUS(status)获取退出码;如果为假,则异常退出,退出信号我们自己获取

如果子进程一直没有退出,父进程就一直在阻塞等待,第一,我们***如何理解这种阻塞等待?***第二,能不能让父进程在等待的期间干其他事,提高效率?

  • 子进程本身是软件,父进程本质是在等待某种软件条件就绪,会将task_struct插入到子进程的等待队列中

  • pid_t waitpid(pid_t, int* status, int options)的第三个参数设置为WNOHANG,表示非阻塞等待

    rid > 0:等待成功

    rid == 0:子进程还在运行,需要下一次来等待

    rid < 0:等待失败

在这里插入图片描述

4. 进程程序替换


在这里插入图片描述

现象:

  1. 进程执行了ls -la操作
  2. execl()函数之后的代码不再执行

出现以上现象的原因是:exec*系列的函数将当前程序替换成指定的程序了

4.1 进程程序替换的原理

进程的程序替换的本质是将该进程的代码和数据替换为指定程序的代码和数据,在替换期间没有创建进程

从被替换者的角度看,就是这个程序加载到内存当中了;我们之前说程序被运行之前需要加载到内存当中,是怎么加载的呢?其实是用加载函数完成的,而execl*系列的函数就是Linux中的加载函数

4.2 exec*系列函数

int execl(const char* path, const char* arg, ...);
int execv(const char* path, char* const argv[]);

int execlp(const char* file, const char* arg, ...);
int execvp(const char* file, char* const argv[]);

int execle(const char* path, const char* arg, ..., char* const envp[]);
int execvpe(const char* file, char* const argv[], char* const envp[]);

在这里插入图片描述

之前我们说,我们希望创建子进程干两种事情:

  1. 让子进程执行父进程代码的一部分
  2. 让子进程执行一个全新的程序

如果让子进程执行一个新的程序,按照之前的知识,父子进程共用同一份代码,数据按照写时拷贝的方式相互独立,但此时新程序有自己的代码,不可能跟父进程共用代码;因此,程序替换会将子进程的代码和数据都写时拷贝一份,再去替换子进程的代码和数据

知道了如何使用exec*系列函数替换进程程序,就能创建子进程,然后替换,让子进程完成其他程序的工作;这里的程序可以是系统内的,也可以是我们自己的程序

在这里插入图片描述

我们也可以自定义命令行参数和环境变量传给新程序,也可以使用bash中的命令行参数和环境变量

在这里插入图片描述

由此我们能得知,bash是如何给子进程传递自身建立的命令行参数表和环境变量表,其原理都是一样的

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

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

相关文章

python零基础入门笔记【源源老师】

1. print() 输出 &#xff08;1&#xff09;认识英文单词 print: 输出&#xff08;2&#xff09;print() 的作用 print()&#xff1a;用于在控制台上输出你想要的内容。 &#xff08;3&#xff09;代码演示 举例1&#xff1a; 【注意&#xff1a;】用双引号包裹的&#xff0…

OpenHarmony开发实例:【新闻客户端】

介绍 本篇Codelab我们将教会大家如何构建一个简易的OpenHarmony新闻客户端&#xff08;JS版本&#xff09;。应用包含两级页面&#xff0c;分别是主页面和详情页面&#xff0c;两个页面都展示了丰富的UI组件&#xff0c;其中详情页的实现逻辑中还展示了如何通过调用相应接口&a…

交友盲盒1.4.5

本文来自&#xff1a;微擎交友盲盒1.4.5 - 源码1688 应用介绍 品牌其他语言PHP数据库Mysql移动端Wap自适应公众服务号大小80 MB规格整站源码授权免授权源文件完全开源&#xff08;含全部源文件&#xff09;伪静态需要操作系统Windows&#xff0c;Linux安装方式QQ远程协助web服…

客户资料不翼而飞?企业数据保护攻略

在数字化经济时代&#xff0c;企业的客户资料等同于商业生命线&#xff0c;一旦泄露&#xff0c;后果不堪设想。例如&#xff0c;2017年Equifax的数据泄露事件&#xff0c;造成超过1.4亿用户的个人信息外泄&#xff0c;不仅给用户带来风险&#xff0c;也让公司名誉受损&#xf…

IDC发布2023年中国整体超融合市场报告,深信服第一

4月15日&#xff0c;IDC发布了《中国软件定义存储 (SDS)及超融合存储系统 (HCI)市场季度跟踪报告&#xff0c;2023年第四季度》。 报告显示&#xff0c;中国超融合市场在2023年较去年同期实现2.9%增长&#xff0c;其中HCI 验证系统市场占有率较去年同期上升近4%&#xff0c;接近…

Day01-环境准备与镜像案例

Day01-环境准备与镜像案例 1. 容器架构1.1 Iaas Paas Saas (了解)1.2 什么是容器1.3 容器vs虚拟机1.4 Docker极速上手指南1&#xff09;配置docker源(用于安装docker)2&#xff09;docker下载镜像加速的配置3&#xff09;自动补全 1.5 Docker C/S架构1.6 Docker的镜像管理1&…

MySQL基础-----约束详解

目录 一. 概述: 二.约束演示&#xff1a; 三.外键约束&#xff1a; 3.1介绍&#xff1a; 3.2外键约束语法&#xff1a; 3.3删除&#xff0c;更新行为&#xff1a; 一. 概述: &#x1f9d0;&#x1f9d0;概念&#xff1a;约束是作用于表中字段上的规则&#xff0c;用于限制…

真正的跨数据库

jrt不同于主流Springmybats框架宣传的多数据支持。引入mybats之后多数据库支持基本就是无稽之谈&#xff0c;一堆Mapper写SQL语句&#xff0c;多数据库支持从最开始就变成只能连多种数据库&#xff0c;而不是业务程序可以跑在多种数据库上面不用改动。一个框架如果不能解决常规…

盘点入驻天府锋巢直播产业基地,能够享受哪些政策优惠?

直播产业谱写了互联网时代下最新的狂想曲&#xff0c;在短短几年时间&#xff0c;各数资本、品牌、MCN、主播不断涌入其中。根据招商证券预测&#xff0c;直播产业将是一个万亿级市场&#xff0c;在宏大的趋势面前&#xff0c;没有人能视而不见&#xff0c;直播电商的未来已来。…

算法题解记录13+++杨辉三角(百日筑基)

本题是动态规划的问题&#xff0c;我也在此阐述我对动态规划的理解&#xff0c;如有不准确、缺失、错误&#xff0c;敬请斧正。 题目描述&#xff1a; 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和…

Elasticsearch的使用教程

Elasticsearch简介 Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎&#xff0c;能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心&#xff0c;Elasticsearch 会集中存储您的数据&#xff0c;让您飞快完成搜索&#xff0c;微调相关性&#xff0c;进行…

Pytorch-张量形状操作

&#x1f606;&#x1f606;&#x1f606;感谢大家的观看&#x1f606;&#x1f606; &#x1f339; reshape 函数 transpose 和 permute 函数 view 和 contigous 函数 squeeze 和 unsqueeze 函数 在搭建网络模型时&#xff0c;掌握对张量形状的操作是非常重要的&#xff…

智慧电网数据可视化运维云平台解决方案

智慧电力概述 智慧电力是通过采用先进的大数据、云计算、物联网、边缘计算等技术&#xff0c;实现生产信息与管理信息的智慧&#xff0c;实现人、技术、经营目标和管理方法的集成&#xff0c;是企业管理思想的一个新突破。智慧电厂建设具备智能化、一体化、可观测、可互动、自…

实验一:配置IP地址

1.实验环境 主机A和主机B通过一根网线相连 2.需求描述 为两台主机配置IP地址&#xff0c;验证IP地址是否生效&#xff0c;验证 同一网段的两台主机可以互通&#xff0c;不同网段的主机不能 直接互通 3.推荐步骤 1. 为两台主机配置P地址&#xff0c;主机A为10.0.10.10&#…

python 头文件怎么写

本文主要以python2为例。首先介绍一下Python头文件的编程风格&#xff0c;然后再给大家详细介绍import部分的基本用法。这两个部分就是Python中头文件的组成模块。 编程风格 #!/usr/bin/env python #在文件头部 ( 第一行 ) 加上 设置 Python 解释器 # -*- coding: utf…

pyqt的人脸识别 基于face_recognition库

参考文献&#xff1a; 1、python face_recognition实现人脸识别系统_python facerecognition检测人脸-CSDN博客 2、cv2.VideoCapture()_cv2.videocapture(0)-CSDN博客 1、camera.py文件代码如下&#xff1b;目录如下 import sys from PyQt5.QtWidgets import QApplication, …

FTP服务器的搭建(windows)

一、开启FTP功能 1.控制面板 2.卸载程序 3. 启用或关闭windows功能 4.勾选 5.确定 二、创建登录ftp的账户 1.此电脑右击管理 三、创建FTP服务器 1.win键&#xff0c;输入iis 2.点击IIS管理器 四、测试 1.查看本机ip地址 2.打开一个文件夹&#xff0c;输入ftp://192.168.103…

UE5学习日记——实现自定义输入及监听输入,组合出不同的按键输入~

UE5的自定义按键和UE4有所不同&#xff0c;在这里记录一下。 本文主要是记录如何设置UE5的自定义按键&#xff0c;重点是学会原理&#xff0c;实际开发时结合实际情况操作。 输入映射 1. 创建输入操作 输入操作并不是具体的按键映射&#xff0c;而是按键的激活方式&#xff0…

python代码打包exe文件

创建和激活虚拟环境 创建虚拟环境 首先让我们创建一个虚拟环境。你可以使用 venv 模块来创建一个虚拟环境。以下是创建虚拟环境的步骤&#xff1a; 打开终端&#xff08;或命令提示符&#xff09;&#xff1a;进入你想要创建虚拟环境的目录。 运行以下命令来创建虚拟环境&a…

OLAP引擎优缺点简单对比

总结&#xff1a; 数据压缩率Clickhouse好&#xff1b;ClickHouse单表查询性能优势巨大&#xff1b;Join查询两者各有优劣&#xff0c;数据量小情况下Clickhouse好&#xff0c;数据量大Doris好&#xff1b;Doris对SQL支持情况要好&#xff1b;