【Linux】11. 进程控制

news2025/1/11 8:38:27

小实验(谨慎测试)

在这里插入图片描述

1. 进程退出码的引出

在这里插入图片描述

2. 进程码的使用

在这里插入图片描述

3. 进程退出

3.1 进程退出情况

进程退出分三种情况:
1.代码运行完毕,结果正确 – return 0;
2.代码运行完毕,结果不正确 – 根据退出码判断错误情况
3.代码没有运行完毕,程序出现异常,退出码毫无意义

3.2 进程退出方式

在这里插入图片描述
对于第二第三种情况:exit()函数的底层实现就是通过调用_exit()系统接口来实现的。
我们再来看一种现象:
在这里插入图片描述
在这里插入图片描述

4. 进程等待

在之前进程状态的学习中,我们认识到一种状态–“僵尸状态” --“Z” ,僵尸状态的原因是由于父进程未接收子进程退出信息导致的,子进程一直处于僵尸状态等待父进程接收其退出信息。僵尸进程是一种危害,存在内存泄漏的问题,该如何解决呢?

–通过进程等待的方式解决僵尸问题,如何解决:进行回收子进程资源并接收子进程退出信息

4.1 进程等待方式

4.1.1 wait方法

在这里插入图片描述

4.1.2 waitpid方法

在正式认识waitpid方法之前我们需要先认识一个输出型参数status(专门接收并输出给操作系统的参数)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

再谈进程退出

进程退出会使进程进入僵尸状态,等待父进程或者操作系统接收退出结果,这时候进程会将自己的退出结果写入到自己的task_struct(PCB)
而wait/waitpid是系统调用接口,让操作系统去读取子进程的task_struct(PCB)的退出信息
进程退出其他资源可以释放,但是PCB必须保留(确保操作系统/父进程接收到子进程退出的信息)

5. 等待实现(操作系统)

操作系统是如何实现这种等待状态的呢? – 分为阻塞等待和非阻塞等待

5.1 阻塞等待

在这里插入图片描述
在这里插入图片描述

5.2 非阻塞等待

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.3 阻塞等待和非阻塞等待的区别

从上述代码还看不出来二者存在什么区别:
阻塞等待:一直处于等待状态
非阻塞等待:在等待的过程中还可以处理其他事务(主要体现在轮询等待的情况)
在这里插入图片描述

5.4 轮询等待的实现

在这里插入图片描述

6. 进程程序替换

在运行进程时,创建子进程的目的是什么?

  1. 想让子进程执行父进程代码的一部分:也就是执行父进程对应的磁盘代码的一部分
  2. 想让子进程执行一个全新的程序:让子进程想办法加载磁盘上指定的程序,并执行新程序的代码和数据
    (这种子进程加载新程序并运行的行为,我们称之为进程的程序替换)

6.1 替换函数

#include <unistd.h>
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ...,char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);

替换函数的作用:将指定的程序(这里的程序指的是在磁盘当中保存的代码和数据)加载到内存当中,让指定的进程进行执行
要使用替换函数首先需要先找到磁盘当中的程序,其次执行命令存在选项,例如:ls -a -l
如何找到呢?-根据第一个参数 const char path*,来找到程序所在位置
根据后面两个参数来实现执行命令参数的选项
(其中括号中带… 这表示的是可变参数列表【可以给C语言传递多个不同个数的参数】)
在这里插入图片描述
很多函数都是存在可变参数列表的,例如上述的printf和scanf,这也就是为什么在打印时可以以不同的形式打印%d/%s等

6.2 使用替换函数

在这里插入图片描述
在这里插入图片描述

6.3 进程替换的原理

用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。
当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。
调用exec并不创建新进程,所以调用exec前后该进程的id并未改变
在这里插入图片描述
在这里插入图片描述
写时拷贝时,程序和数据就会在物理内存上占用新空间(保证了进程的独立性)
这时候也就可以深刻理解shell创建子进程来执行对应的命令(王婆雇佣实习生的案例),
shell命令行解释器也是进程如果不创建子进程,
直接进行程序替换那么我们也就无法通过shell接收返回结果,
如果一旦是非法进程可能直接使得shell挂掉(这样也进一步保护shell)
子进程挂掉不会影响父进程,且父进程可以接收子进程的错误原因并返回给用户

7. exec* 系列函数的分析使用

在这里插入图片描述
其中子进程发生进程替换并不会影响父进程
在这里插入图片描述

7.1 对后缀进行分析

在这里插入图片描述
在这里插入图片描述
实际上默认的环境变量,即便你不传,子进程也能获取
那如果即想获取自定义的环境变量又想获取系统的环境变量该如何操作呢?
在这里插入图片描述
针对这些后缀分析完毕后,要了解一个概念,之前的学习过程中总是说程序要运行必须先加载到内存当中,如何加载呢?
在Linux下采用的就是exec系列的接口 – exec系列的函数又被称之为加载器
提问我们在编写程序时main(int argc,charargv[ ],char env[ ])是先加载呢?还是先执行main函数?
答案:先加载,main函数也是函数,也需要被调用传参,这些工作都离不开加载器
而main函数中的三个参数正是从exec*系列函数当中的参数而来(环境变量/命令行参数)
即便main函数不传递参数,子进程照样可以拿到系统默认的环境变量,通过environ表/虚拟地址空间的方式让子进程获取

8. 替换自己写的程序

以上的学习进程替换都是替换的系统命令,那如果我们想实现通过子进程替换我们自己编译的代码该如何实现呢?

C语言

在这里插入图片描述
这只是C语言的情况,那么是否可以实现不同语言中的程序替换呢?
答案:可以

C++

在这里插入图片描述

Python

在这里插入图片描述

shell

在这里插入图片描述
程序替换,可以让任何后端语言调用起来(甚至java也可以,但是非常麻烦:java虚拟机的存在)

总结

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

如何0基础自学黑客(网络安全)技术,万字长文教你如何学习黑客(网络安全)

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员&#xff08;以编程为基础的学习&#xff09;再开始学习 我在之前的回答中&#xff0c;我都一再强调不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;而…

【数字化转型-06】数字化转型咨询项目中如何做好高层访谈

咨询项目中少不了至关重要的一步&#xff0c;那就是高层访谈&#xff0c;做好高层访谈&#xff0c;对于咨询项目至关重要&#xff0c;我们接触的维度越高&#xff0c;就会越能把控项目的真实意图&#xff0c;有的放矢&#xff0c;不会让下面的人带偏&#xff1b;另一方面我们也…

Vue3 使用 Ts 泛型 封装本地存储

前期回顾 NVM —— 你把我玩明白_彩色之外的博客-CSDN博客本文将学习 使用 NVM 管理node版本https://blog.csdn.net/m0_57904695/article/details/130670262?spm1001.2014.3001.5501 目录 新建 \src\utils\storage-utils.ts 使用 泛型示例 泛型交换变量 泛型 strin…

在Linux系统中用vim编写第一个C语言之gcc编译器

文章目录 在Linux系统中用vim编写第一个C语言HelloWorld第一步 创建第二步 编写第三步&#xff0c;编译第四步 运行 gcc四步骤gcc常用选项 在Linux系统中用vim编写第一个C语言HelloWorld 第一步 创建 vim HelloWorld.c第二步 编写 #include<stdio.h>int main(){printf(…

Android Jsoup爬取网页数据及其局限性,接口爬取数据的思路

1.Jsoup jsoup 是一款Java 的HTML解析器&#xff0c;可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API&#xff0c;可通过DOM&#xff0c;CSS以及类似于jQuery的操作方法来取出和操作数据。 需求是需要获取某个网站上的排行榜数据&#xff0c;用作App展示&am…

【axios】后端未收到前端post传参

今天遇到过问题&#xff0c;前端post请求参数明明已经传过去了&#xff0c;可是后端说没收到&#xff0c;不知道后端大哥是不是故意搞我。 代码前端图如下↓ 代码 import axios from axios //对象形式 const val {pass:123,user:name}axios.post(/api/login, val).then(res>…

Vue3-黑马(十三)

目录&#xff1a; &#xff08;1&#xff09;vue3-router-动态路由3 &#xff08;2&#xff09;vue3-进阶router-动态菜单 &#xff08;3&#xff09;vue3-进阶-router-令牌-获取用户信息 &#xff08;1&#xff09;vue3-router-动态路由3 登录页面后&#xff0c;如果点击了…

Android技术探索与实践:从新功能体验到故障调试的全方位探索

目录 Android技术探索与实践&#xff1a;从新功能体验到故障调试的全方位探索 第一章&#xff1a;技术解析 Android平台的架构和工作原理 应用组件的生命周期和交互方式 Android开发中常用的设计模式和技术框架解析 第二章:产品新功能体验测评 深入了解最新发布的Androi…

【安卓源码】Binder机制5 -- Java层Framework Binder机制和 AIDL

图中红色代表整个framework层 binder架构相关组件&#xff1b; Binder类代表Server端&#xff0c;BinderProxy类代码Client端&#xff1b;图中蓝色代表Native层Binder架构相关组件&#xff1b;上层framework层的Binder逻辑是建立在Native层架构基础之上的&#xff0c;核心逻辑都…

shell编程:概述、脚本入门、变量、运算符、条件判断、流程控制、读取控制台、函数、正则表达式、文本处理工具、综合案例

第 1 章 Shell 概述 1&#xff09;Linux 提供的 Shell 解析器有 [atguiguhadoop101 ~]$ cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash /bin/tcsh /bin/csh2&#xff09;bash 和 sh 的关系 sh&#xff1a;比较基础bash&#xff1a;功能更加强大&#xff0c;默…

三十四、Hybrid 接口用法解析

文章目录 前言交换机接口类型有哪些Hybrid 端口使用场景什么时候必须使用 Hybrid 一、Hybrid 特点二、Hybrid 当做 access和trunk使用三、Hybrid 特殊用法 前言 交换机接口类型有哪些 Access、trunk、Hybrid、qinq Hybrid 端口使用场景 接pc、服务器、接交换机、接路由器&a…

Linux守护进程

"忍耐的灵魂啊&#xff0c;安静地运转吧~" 我们先来看看这个场景。这是一个常见的基于TCP套接字的网络服务器&#xff0c;服务端接收客户端发送的消息&#xff0c;收到后并向echo回响给客户端。 对于Linux而言&#xff0c;终端只能有一个前台进程&#xff0c;这也是为…

行业唯一丨冠珠出席“中国企业社会责任高峰论坛”,并荣获人民日报社“ESG年度案例”

践行社会责任&#xff0c;推动品牌高质量发展。5月11日&#xff0c;由人民日报社指导、人民日报社经济社会部主办的“中国企业社会责任高峰论坛”在上海盛大举行。 本次论坛围绕乡村振兴、共同富裕、绿色低碳等重点议题进行深入研讨&#xff0c;邀请国家发展和改革委员会、商务…

教程硬货|微信小程序开发之基于vue的微信开发工具JS文件解读(一)

文章目录 1 前言2 前期准备3 微信开发者工具3.1 创建项目3.2 页面介绍 4 读懂Pages4.1 index.wxss4.2 index.wxml4.3 index.json4.4 index.js 5 logs6 小程序的主要文件6.1 app.js6.2 app.json 7 讨论 1 前言 鉴于前段时间出的第一篇记录安装Nodejs和HBuilderX搭建、部署微信小…

【C++】内存分区模型

目录 1、缘起 2、内存分区模型 2.1、程序运行前 2.2、程序运行后 3、总结 1、缘起 前几天学习完了 C 的 基础语法 知识点&#xff0c;现在终于要踏上学习 C 核心编程 的旅程了&#xff0c;期待沿途中所遇到的风景。 2、内存分区模型 C 程序在执行时&#xff0c;将内存大…

【Python Cookie 和代理 IP】零基础也能轻松掌握的学习路线与参考资料

一、Python Cookie 1、什么是Cookie&#xff1f; Cookie是一种在客户端保存数据的机制&#xff0c;服务器通过在HTTP响应头中添加Set-Cookie头实现。浏览器在接收到响应头中的Set-Cookie后&#xff0c;会将这个Cookie保存在本地。之后每次请求都会将本地保存的Cookie自动添加…

WPF插件之 - PropertyChanged.Fody插件的使用详解

总目录 文章目录 总目录一、PropertyChanged.Fody是什么&#xff1f;二、PropertyChanged.Fody的安装三、PropertyChanged.Fody的功能1. 特性1 实现属性通知的功能2 通知其他属性4 不进行属性通知3 指定属性更改时将调用的方法5 设置当前属性依赖的属性6 不检查是否相等7 DoNot…

lua:浅谈对元表和元方法的认识

前言 本篇在讲什么 浅谈对Lua元表和元方法的理解 本篇适合什么 适合初学Lua的小白 本篇需要什么 对Lua语法有简单认知 依赖Lua5.1的环境 依赖Sublime Text3编辑器 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码…

ETCD实现分布式锁

分布式锁具备特点 互斥性&#xff1a;在同一时刻&#xff0c;只有一个客户端能持有锁 安全性&#xff1a;避免死锁&#xff0c;如果某个客户端获得锁之后处理时间超过最大约定时间&#xff0c;或者持锁期间发生了故障导致无法主动释放锁&#xff0c;其持有的锁也能够被其他机制…

ANR实战案例 - FCM拉活启动优化

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 文章目录 系列文章目录前言一、Trace日志分析二、业务分析1.Firebase源码分析2.Firebase官方查看官方文档Dem…