4.环境变量

目录

1.并行与并发

2. 环境变量

2.1 举例子

2.2 命令行参数

2.3 环境变量


 

1.并行与并发

并行:多个进程在多个CPU下分别、同时运行,称为并行

并发:多个进程在一个CPU下采用进程切换的方式,在一时间段内,多个进程同时推进,称为并发

有这样一个问题

int get_value() 
{int x = 42;  return x;    
}int main()
{int ret = get_value();cout << ret << endl;return 0;
}

为什么函数的返回值,会被外部拿到呢?

        通过CPU寄存器,编译器将return x转化成了mov eax 10,eax是CPU中的寄存器,函数直接将x的值放入了寄存器,x自己销毁并不影响这个寄存器,调用方仍可以拿到。

既然进程在一直切换,每个进程就执行时间片的时间,系统如何得知某个进程上次执行到哪行代码了?

        有一个程序计数器eip,存储当前执行指令下一条指令的地址

CPU中有很多寄存器,扮演什么角色?

        提高运行效率,进程的高频数据放入寄存器中。因为进程相关的数据需要随时被访问或者修改,所以要放到CPU的寄存器中。

所以CPU寄存器中保存的是进程的临时数据也就是进程的上下文。进程在从CPU上离开的时候,要将自己的上下文数据保存好,甚至带走,这个保存的目的就是为了恢复。

进程在被切换的时候:保存上下文;进程回来运行时,恢复上下文。

上下文信息就当保存到进程的PCB中,PCB有一个寄存器结构体,专门存每个寄存器中的这些信息

2. 环境变量

直接讲概念有些晦涩,先举几个环境变量出来认识一下。

2.1 举例子

1. 我们想执行自己写的程序就得指明路径:./mycode,那系统怎么知道 ls、pwd 等指令执行时去哪里找呢?怎么知道这些指令程序在哪里呢?

        OS在执行命令时,shell会在PATH中的路径下一个一个去找。

PATH:Linux系统的指令搜索路径,以:进行分割

也可以添加其他目录到PATH中,重登Xshell就重置了。

2. 当我们登入时,它怎么知道一上来就在家目录下呢?而不是什么其他的目录呢?

HOME:登入时会执行类似cd &HOME 这样的命令,直接跳到家目录下。

PWD:会记录当前目录的环境变量

有了环境变量的存在,我们的系统就具备了认识用户是谁的能力,只要能认识用户是谁,就能把文件拥有者和权限做对比,从而判断出用户有无读写权限

2.2 命令行参数

ls是命令,后面的-l就是命令行参数

对这个代码进行下面这样的调用产生了命令行参数类型的结果:

这个程序很好的模拟了命令行参数的实现过程,argv[0]就是命令本身,后面的可变参数列表存储命令行参数。

我们输入的其实是字符串,bash将其打散成 "./mycmd"、"-a"、"b"、"c"。

所以在真正执行main函数之前,操作系统已经干了很多事情了。

为什么要传给main参数呢?为指令、工具、软件等提供命令行选项的支持。

这个代码更能详细的说明命令行参数的作用

可以发现系统自己的命令其实就是类似这么实现的,异曲同工

我们可以发现,main函数也是函数,是操作系统来给它传参,调用它。

2.3 环境变量

但main函数不只这两个参数,还有第三个 env

env代表环境变量表,前面的argv代表命令行参数表

这个程序可以打印出所有环境变量:

我们所运行的进程,都是bash的子进程,bash本身在启动的时候,会从操作系统的配置文件中读取环境变量信息,子进程会继承父进程交给它的环境变量,所以环境变量会被所有子进程继承下去,环境变量具有全局属性

怎么证明被继承了?
我们自己搞一个环境变量,看看它会不会被继承。

我们可以看到,在命令行中直接定义,在env中是找不到的,这时这个变量叫做本地变量,怎么变成环境变量呢?下一行:export,此时就可以找到我们自己定义的环境变量了。

./mycmd 也是能拿到这个环境变量的

本地变量只会在本bash内有效不会被继承,而echo是没有创建子进程的,所以echo是能打印这个本地变量的。 

这也说明了:命令不一定全都会创建子进程,很有把握的就直接操作了,不用担心会影响bash。

所以命令有两种:

  • 常规命令:通过创建子进程去完成的
  • 内建命令:bash不创建子进程,而是由自己亲自执行,类似于bash调用了自己写的、或者系统提供的函数(cd 也是典型的内建命令)

取消环境变量:

环境变量就是在操作系统中用来指定操作系统运行环境的一些参数

int main()
{printf("%S\n", getenv("PATH"));return 0;
}

这样也是可以获得环境变量的

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

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

相关文章

Spring Boot 中使用 Feign 调用内网 IP 接口并记录入参与出参

在微服务架构中&#xff0c;服务间的通信是常见的需求。Spring Cloud 提供的 Feign 客户端是一个声明式的 Web 服务客户端&#xff0c;它使得服务间的调用变得非常简单。然而&#xff0c;在实际开发中&#xff0c;我们可能需要调用内网 IP 地址的接口&#xff0c;并且希望记录请…

【Java】 使用 HTTP 响应状态码定义web系统返回码

系统状态码定义 public interface GlobalErrorCodeConstants {ErrorCode SUCCESS new ErrorCode(0, "成功");// 客户端错误段 ErrorCode BAD_REQUEST new ErrorCode(400, "请求参数不正确");ErrorCode UNAUTHORIZED new ErrorCode(401, "账号未登…

如何搭建spark yarn模式的集群

一、基础环境准备 ‌安装JDK 1.8‌ 所有节点需安装JDK并配置环境变量&#xff0c;确保JAVA_HOME正确指向安装路径14。‌部署Hadoop集群‌ 安装Hadoop&#xff08;推荐3.x版本&#xff09;&#xff0c;配置YARN资源管理器4。在yarn-site.xml中启用资源调度&#xff1a; <pro…

python22-元组、列表、字典、集合推导式

课程&#xff1a;B站大学 记录python学习&#xff0c;直到学会基本的爬虫&#xff0c;使用python搭建接口自动化测试就算学会了&#xff0c;在进阶webui自动化&#xff0c;app自动化 循环语句小作业 元组推导式列表推导式字典推导式实践是检验真理的唯一标准 推导式 简介 Pytho…

探索 CameraCtrl模型:视频生成中的精确摄像机控制技术

在当今的视频生成领域&#xff0c;精确控制摄像机轨迹一直是一个具有挑战性的目标。许多现有的模型在处理摄像机姿态时往往忽略了精准控制的重要性&#xff0c;导致生成的视频在摄像机运动方面不够理想。为了解决这一问题&#xff0c;一种名为 CameraCtrl 的创新文本到视频模型…

跨端开发技术总结

1.electron&#xff1a; 基于node.js 桌面端&#xff1a;window / linux / macos 手机端&#xff1a;无 页面&#xff1a;网页开发相关技术都可以 2.tauri 基于rust 桌面端&#xff1a;window / linux / macos 手机端&#xff1a;android / IOS 页面&#xff1a;网页开…

单片机-89C51部分:7、中断

飞书文档https://x509p6c8to.feishu.cn/wiki/A5gcwyL5giq1JOkkcsscn8eLnzf 一、中断的作用 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的&#xff0c;中断功能的存在&#xff0c;很大程度上提高了单片机处理外部或内部事件的能力。它也是单片机最重要的功…

0805登录_注册_token_用户信息_退出-网络ajax请求2-react-仿低代码平台项目

文章目录 1 JWT1.1 JWT结构1.2 工作流程1.3 优点1.4 缺点1.5 安全实践1.6. 适用场景1.7 JWT与OAuth2**8. 示例代码&#xff08;Node.js&#xff09;** 2 用户mock和api3 注册4 登录5 token存储6 请求拦截器设置token6 获取用户信息7 退出登录结语 1 JWT JSON Web Token&#x…

大模型入门

一、模型入门路径 1. 学习预备知识 编程语言&#xff1a;熟练掌握Python编程语言&#xff0c;包括基本语法、数据结构&#xff08;列表、字典、元组等&#xff09;、面向对象编程、文件操作等。Python有丰富的机器学习和深度学习库&#xff0c;方便进行大模型的开发和实验。数…

把dll模块注入到游戏进程的方法_插APC注入

一、概述 APC是异步过程调用,系统创建线程的时候会为线程创建一个APC队列,当线程调用SleepEx,WaitSingleObjectEx等函数时,并把线程状态被设置为可提醒状态时,线程并不会睡眠,而是检查APC队列是否为空,如果不为空,转去执行APC队列中的每一项,因此给目标进程中的线程插…

git 如何清空当前分支的历史提交记录,仅保留最后一次提交

本方法基于新建 Git 孤立分支实现&#xff1a; 1. ​​首先检出待清理的分支 在 IDEA 右下角检查当前分支名称 或执行 git branch 确认。如果不在目标分支上&#xff0c;会显示 (HEAD detached at xxxxx)&#xff0c;这时需要先切换分支&#xff1a; git checkout 原分支名 2.…

【C++】Googletest应用

Googletest 1 配置 使用cmake配置&#xff1a; 具体文件后面上传补充 ./test.out --gtest_filterXXXTest.xxx 2 gdb 为了跟踪流程&#xff0c;可以使用gdb&#xff1b; gdb ./xxx.out gdb --args ./gtest --gtest_filterxxx.xxx设置运行参数 set args --gtest_filterxxx.…

JavaScript:从DOM概述到window对象的常见事件

一、BOM概述 1.BOM的概念 BOM&#xff08;Browser Object Model&#xff09;即浏览器对象模型&#xff0c;它提供了独立于内容而与浏览器窗口进行交互的对象&#xff0c;其核心对象是window 2.BOM的构成 BOM比DOM更大&#xff0c;它包含DOM window对象是浏览器的顶级对象&a…

qobject与event事件应用

int main(int argc, char *argv[]) {QApplication a(argc, argv);MyWidget mainWidget;mainWidget.setWindowTitle("QObject与事件处理示例");mainWidget.resize(200, 200);mainWidget.show();return a.exec(); }QApplication a(argc, argv);&#xff1a;创建 QAppli…

QTableView复选框居中

目录 方法一&#xff1a;QSS方法2:自定义复选框委托类一、构造函数 CheckBoxDelegate()二、paint() 方法三、editorEvent() 方法四、关键设计要点五、扩展应用场景六、代码示例&#xff08;补充&#xff09; 方法一&#xff1a;QSS QTableView::indicator {position: relative…

基于QT的仿QQ音乐播放器

一、项目介绍 该项目是基于QT开发的⾳乐播放软件&#xff0c;界面友好&#xff0c;功能丰富&#xff0c;主要功能如下&#xff1a; 窗口hand部分&#xff1a; 点击最小化按钮&#xff0c;窗口最小化 点击最大化按钮&#xff0c;窗口最大化 点击关闭按钮&#xff0c;程序退出 …

SQL知识点合集---第二弹

数据一 <select id"listPositionAuditCheckSample" resultType"net.nxe.cloud.content.server.entity.PositionAuditCheckSample"><trim prefixOverrides"union all"><if test"userSampleCount ! null and userSampleCount…

【QT】QT控制硬件

QT控制硬件 1.上位机程序开发2.具体例子控制led灯3. linux中的函数跟QT类里面的函数同名&#xff0c;发生冲突4.示例代码 1.上位机程序开发 QT做一个上位机程序&#xff0c;控制底层的硬件设备(下位机) 总结&#xff1a; 在构造函数里面去初始化&#xff0c;打开硬件驱动在析…

Flutter介绍、Flutter Windows Android 环境搭建 真机调试

目录 Flutter介绍 Windows 环境搭建 1.安装配置JDK 2.下载安装Android Studio 3.下载配置Flutter SDK ​4.运行Flutter doctor命令检测环境是否配置成功 ​5.打开Android Studio安装Flutter/Dart 插件 ​6.插件运行Flutter项目 ​编辑 Flutter Android真机调试 Flut…

Android Studio 中使用 SQLite 数据库开发完整指南(Kotlin版本)

文章目录 1. 项目准备1.1 创建新项目1.2 添加必要依赖 2. 数据库设计3. 实现数据库3.1 创建实体类 (Entity)3.2 创建数据访问对象 (DAO)3.3 创建数据库类 4. 创建 Repository5. 创建 ViewModel6. 实现 UI 层6.1 创建笔记列表 Activityactivity_notes_list.xmlNotesListActivity…