当前位置: 首页 > news >正文

【Linux笔记】Linux环境变量与地址空间

【Linux笔记】Linux环境变量与地址空间

  • 一、命令行参数
    • 1.1、main函数的参数
    • 1.2、main函数的第三个参数
  • 二、环境变量的概念与内容
    • 2.1、环境变量的概念
    • 2.2、环境变量的分类
    • 2.3、环境变量的组织形式
    • 2.4、常见的环境变量
  • 三、设置环境变量
    • 3.1、通过命令获取或设置环境变量
    • 3.2、通过代码获取获取环境变量
    • 3.3、通过系统调用获取或修改环境变量
  • 四、进程地址空间的概念
    • 4.1、C/C++程序员认为的空间排布
    • 4.2、虚拟地址与物理地址
    • 4.3、地址空间与物理内存之间转换
    • 4.4、理解为什么要有地址空间

一、命令行参数

1.1、main函数的参数

我们以前在写C/C++程序的main函数的时候,应该都是不带参数的:

int main() {printf("hello world!!\n");return 0;
}

这可能会让人形成一种误解,为main函数式不能带参数的。

但事实上,main函数是可以带参数的,如果是学过java的朋友可能很清楚这一点:

int main(int argc, char *argv[]) {return 0;
}

从参数的形式可以看出,一个是int类型的变量一个是一个指针数组,可这是用来干嘛的啊?
其实这个argv里存的每一个字符指针都指向一个命令行参数,而argc这是这些参数的个数,我们可以在程序中打印出这些参数:
在这里插入图片描述
如上图,其实我们在运行我们自己所写的程序时候也可以传入一些参数,而系统会将我们呢传递的这些参数以空格为分隔,将它们转化成字符串放入argv数组中,然后我们就可以在程序中打印出这些字符串了,而第一个字符串是程序的名字,这是怎样都会存在的。
注意: 打印这些字符串需要c99才支持,所以我们需要再makefile文件中指定编译标准为c99。

但这又有什么用呢?难道只是为了打印这么简单吗?

其实我们类比我们平时在shell里面敲的各种指令就很好理解了。
例如ls指令,我们不单单可以只执行ls,也可以加入各种选项让它以不同的方式运行比如ls -l表示显示出文件的详细信息,ls -a表示显示出所有文件包括隐藏文件。

而我们平时写的各种C/C++程序运行起来后都是一个进程,shell中的各种指令运行起来也都是进程,所以我们也可以通过命令行参数的形式来是我们自己写的程序以不同的方式运行。

我们也可以将其类比成函数传参,传入不同的参数函数就会计算出不同的结果,只不过这些参数是程序外传进来的:
在这里插入图片描述

1.2、main函数的第三个参数

其实main函数还有第三个参数env,这第三个参数就与我们今天要讲的环境变量有关了,它的本质也是一个字符指针数组,其中每个指针执行的都是一个环境变量,我们也可以先将它打印出来看看鲜:
在这里插入图片描述

二、环境变量的概念与内容

2.1、环境变量的概念

大家可能都或多或少的听说过 “环境变量” 这个词,当我们在安装一些软件或是语言例如java、python时都有要求过配置环境变量。

其本质目的就是为了操作系统能直接找到对应的软件或者指令,也可以理解成是在操作系统环境中的一个变量,所以操作系统能直接的找到它。

这时候我们再看看对于环境变量比较学术的概念就会好理解一会点了:

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。
环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程。

2.2、环境变量的分类

环境变量可以按作用范围和生存周期分为两类:
按作用范围分类:

环境变量: 相当于全局变量,存在于所有的Shell中,且具有继承性。
本地变量: 相当于局部变量,只存在于当前的Shell中,本地变量包含环境变量,但非环境变量不具有继承性。

按生存周期分类:

永久性环境变量: 需要修改配置文件,变量永久保存。
暂时性环境变量: 使用export定义,关闭Shell后失效。

2.3、环境变量的组织形式

我们所创建的所有进程其实都对应有一张环境变量表,这一张表其实就是一个字符指针数组(也可以理解成是一个字符串数组),其结构大致如下:
在这里插入图片描述
环境变量表中的每一个指针都指向一个字符串,字符串的内容其实就是一些描述信息,最后以NULL结尾。

2.4、常见的环境变量

我们可以使用一下指令来查看一些常见的环境变量:

echo $环境变量名

1、PATH
PATH变量指定我们输入的各种指令的搜索路径:
在这里插入图片描述

2、HOME
该变量指定用户的主工作目录,即用户登录到Linux系统时,默认的目录:
在这里插入图片描述
以为上面用的是普通用户,所以还会多带个home,如果使用的是root用户,就不会带home了:
在这里插入图片描述
其中的原因也很容易理解,因为root是超级管理员,他当然能访问的范围就是最广的啦,而普通用户的权限较小,所以要放在/home工作目录中进行管理。

3、HISTSIZE
该变量查看Linux系统保存历史命令的数目:
在这里插入图片描述
其显示结果说明当前Linux系统中最多保存1000条历史命令。

4、LOGNAME
该变量指定显示当前的用户名:
在这里插入图片描述
5、HOSTNAME
该变量显示当前主机名称:
在这里插入图片描述
6、SHELL
该变量显示用户当前使用的解析器:
在这里插入图片描述

三、设置环境变量

3.1、通过命令获取或设置环境变量

我们可以通过一些命令来获取或设置环境变量。
1、echo
该命令能显示某一个环境变量的值。
这个命令我们上面已经演示过了:
在这里插入图片描述
2、env
该命令可以显示所有的环境变量:
在这里插入图片描述
3、set
set命令显示本地定义的shell变量和环境变量:
在这里插入图片描述
4、export
export命令可以创建一个新的环境变量:
在这里插入图片描述
使用export创建的环境变量值是一个暂时性的环境变量,如果关闭shell再重启就会失效。

5、unset
unset 命令功能是清除指定的环境变量:
在这里插入图片描述
6、readonly
该命令用于设置只读的环境变量:
在这里插入图片描述
只读的环境变量就是只能读取而不能修改,消除的办法只有重启shell。

3.2、通过代码获取获取环境变量

我们可以通过main函数的第三个参数——环境变量地址指针数组 来获取环境变量:
在这里插入图片描述
其打印的结果几乎和我们在命令行使用env打印出来的一样:
在这里插入图片描述

我们也可以通过第三方变量environ获取环境变量:
在这里插入图片描述
变量environ是系统定义的一个全局的二级指针,它也是指向一个字符指针数组,也可以理解为指向一个环境变量表。

3.3、通过系统调用获取或修改环境变量

我们也可以通过getenv这个系统调用来访问特定的环境变量。
getenv可以获取一个环境变量的地址,我们可以使用一个字符指针来接收:
在这里插入图片描述

四、进程地址空间的概念

4.1、C/C++程序员认为的空间排布

在学习C/C++的时候,我们都会认为内存的划分为这几个区域:栈区、堆区、全局/静态区、代码区、字符常量区……
在这里插入图片描述

这其实只是在语言层面的理解,如果要放到系统层面还是不是这样呢?我们知道一个系统的内存是很大的,要管理的东西也很多,难道就只有上面这些吗?还有这是物理内存吗?

如果要放到系统层面来理解,这里就要给出一个结论:这不是物理内存,这是虚拟内存或进程地址空间。

4.2、虚拟地址与物理地址

在解释虚拟地址与物理地址之前,我们先来看看一个我们以前无法理解的现象。
这是代码:
在这里插入图片描述
这是运行结果:
在这里插入图片描述
我们会惊讶的发现两个进程访问了相同的地址,但是访问到的值竟然是不同的。这要是在以前我们可能会觉得这是不是操作系统出bug了!

其实操作系统并没有出bug,恰恰相反在这一点上操作系统做得很好。

我们知道,父子进程的代码是共享的,而数据是个自有一份的,并且观察以上的结果我们可以推断出变量的值不一样,说明进程中的变量绝对不是同一个变量。既然不是同一个变量,那访问的物理地址也绝不会是同一个。

所以我们曾经在C/C++中用学习到和看到的地址全都是虚拟地址,而物理地址,用户是一概看不到的。

但是程序的代码和数据是一定要存在物理内存上的,因为运行程序之前一定要现将代码和数据加载到物理内存中。

所以操作系统要做的就是将虚拟地址转化成物理地址

4.3、地址空间与物理内存之间转换

其实虚拟地址和物理地址之间的转换主要是通过他们中间的一个“页表”来完成的:
在这里插入图片描述
图中父子进程的g_val的虚拟地址是一样的,但它们通过各自的页表映射到了不同的物理地址。
所以他们实际访问的物理地址是不同的,所以也就能访问到不同的值了。

而为什么说是虚拟地址呢?
其实在Linux中地址空间其实是Linux内核中的一种数据结构,在 Linux 中,OS 除了会为每个进程创建对应的 PCB(即 struct task_struct 结构体),还会创建对应的进程地址空间,即内核中的 struct mm_struct 结构体。
而在这个struct mm_struct 结构体中是通过顶一个各种start和end变量来划分进程地址空间的:

struct mm_struct {// ...unsigned long code_start;   // 代码区起始虚拟地址,比如 0x10000000hunsigned long code_end;     // 代码区结束虚拟地址,比如 0x00001111hunsigned long init_start;   // 已初始化数据区unsigned long init_end;unsigned long uninit_start; // 未初始化数据区unsigned long uninit_end;unsigned long heap_start;   // 堆区unsigned long heap_end;// ...
};

4.4、理解为什么要有地址空间

直接让进程去访问物理内存不就好了吗?为什么还要存在地址空间呢?
其实操作系统这样做也是出于安全着想,在早期的操作系统中是没有进程地址空间的,导致物理内存暴露,恶意程序可以直接通过物理地址,进行内存数据的读取,甚至篡改。

后来随着操作系统的发展迭代,有了进程地址空间(虚拟地址),由操作系统完成虚拟地址和物理地址之间的转化。

这样那些恶意程序就没法直接得到物理地址,我们的操作系统也能更好的受到保护。

相关文章:

【Linux笔记】Linux环境变量与地址空间

【Linux笔记】Linux环境变量与地址空间 一、命令行参数1.1、main函数的参数1.2、main函数的第三个参数 二、环境变量的概念与内容2.1、环境变量的概念2.2、环境变量的分类2.3、环境变量的组织形式2.4、常见的环境变量 三、设置环境变量3.1、通过命令获取或设置环境变量3.2、通过…...

【springboot】@restcontroller和@controller的区别

返回值不同:RestController注解的类中的所有方法都会返回JSON或XML等数据格式,而Controller注解的类中的方法可以返回JSP或HTML等视图页面。 默认注解不同:RestController注解中包含了ResponseBody注解,表示返回的数据会直接作为…...

oracle 不支持的字符集 orai18n.jar ZHS16GBK 异常问题解决

项目场景: 项目中有使用到oracle数据库来存在数据。 问题描述 在使用查询语句是,oracle会报错。 java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK 原因分析: 经排查发现缺少oracle字符集的依赖包导致的。…...

设计模式-04-原型模式

经典的设计模式有23种,但是常用的设计模式一般情况下不会到一半,我们就针对一些常用的设计模式进行一些详细的讲解和分析,方便大家更加容易理解和使用设计模式。 1-什么是原型模式 如果对象的创建成本比较大,而同一个类的不同对象…...

D. Jumping on Walls bfs

Problem - 199D - Codeforces 题目大意:有一个两个垂直的平行墙壁组成的一个峡谷。一个人初始是在左边墙壁第一层。在每个墙壁上有些障碍点,用X表示,这些障碍点不能被到达。,他可以执行以下三个操作: 向当前墙壁往上…...

preg_replace调用system(“ls“)

题目 <?php error_reporting(0); if(isset($_GET[code]) && isset($_POST[pattern])) {$pattern$_POST[pattern];if(!preg_match("/flag|system|pass|cat|chr|ls|[0-9]|tac|nl|od|ini_set|eval|exec|dir|\.|\|read*|show|file|\<|popen|pcntl|var_dump|pr…...

MT8788核心板主要参数介绍_联发科MTK安卓核心板智能模块

MT8788核心板是一款功能强大的4G全网通安卓智能模块&#xff0c;具有超高性能和低功耗特点。该模块采用联发科AIOT芯片平台。 MT8788核心板搭载了12nm制程的四个Cortex-A73和四个Cortex-A53处理器&#xff0c;最高主频可达2.0GHZ。它还配备了4GB64GB(2GB16GB、3GB32GB)的内存&a…...

Matlab批量提取图片特征向量

最近matlab数字图像处理课程需要&#xff0c;对上千张训练集测试集图片进行批量的特征提取&#xff0c;作为 SVM的输入。 所以就有了用matlab来批量提取图像特征向量&#xff0c;并保存&#xff0c;方便后续使用。 批量提取函数&#xff1a; % 函数返回参数% 分类列向量Categ…...

数据库系统原理与实践 笔记 #8

文章目录 数据库系统原理与实践 笔记 #8关系数据库设计(续)规范化(Normalization)范式(Normal Form)第一范式第二范式Boyce-Codd范式(BCNF)将模式分解成BCNFBCNF和保持依赖第三范式 函数依赖理论正则覆盖无关属性无关属性的验证无损分解保持依赖 数据库系统原理与实践 笔记 #8 …...

Ubuntu 和 Windows 文件互传

FTP 服务 FTP 采用 Internet 标准文件传输协议 FTP 的用户界面&#xff0c; 向用户提供了一组用来管理计算机之间文件传输的应用程序。在开发的过程中会频繁的在 Windows 和 Ubuntu 下进行文件传输&#xff0c;比如在 Windwos 下进行代码编写&#xff0c;然后将编写好的代码拿到…...

如何在WPF应用程序中全局捕获异常

在WPF (Windows Presentation Foundation) 应用程序中&#xff0c;你可以使用 AppDomain.CurrentDomain.UnhandledException 事件来全局捕获未处理的异常。这个事件会在应用程序中的任何地方发生未处理的异常时触发。以下是一个简单的例子&#xff0c;演示如何在WPF应用程序中全…...

自定义Matplotlib中的颜色映射(cmap)

要自定义Matplotlib中的颜色映射&#xff08;cmap&#xff09;&#xff0c;您可以按照以下步骤进行操作&#xff1a; 导入所需的库&#xff1a; import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import LinearSegmentedColormap创建自定义颜色映…...

Ansible的filter

环境 控制节点&#xff1a;Ubuntu 22.04Ansible 2.10.8管理节点&#xff1a;CentOS 8 filter 使用filter可以对数据做操作&#xff0c;比如把JSON数据转换为YAML数据&#xff0c;从URL中解析出hostname&#xff0c;提取字符串的SHA1哈希值&#xff0c;做数学运算&#xff0c…...

Qt绘制各种图表

绘制柱状图&#xff1a; void MainWindow::iniBarChart() { //柱状图初始化QChart *chart new QChart(); //创建chartchart->setTitle("Barchart演示");chart->setAnimationOptions(QChart::SeriesAnimations);ui->chartViewBar->setChart(chart); //为…...

【科研新手指南4】ChatGPT的prompt技巧 心得

ChatGPT的prompt心得 写在最前面chatgpt咒语1&#xff08;感觉最好用的竟然是这个&#xff0c;简单方便快捷&#xff0c;不需要多轮对话&#xff09;chatgpt思维链2&#xff08;复杂任务更适用&#xff0c;简单任务把他弄复杂了&#xff09;机理chatgpt完整咒语1&#xff08;感…...

龙蜥社区联合浪潮信息发布《eBPF技术实践白皮书》(附下载链接)

随着 eBPF 技术的高速发展&#xff0c;eBPF 已成为 Linux 内核顶级子系统&#xff0c;并扩展到内核网络、存储、内存、调度和安全等子模块。这种可编程底座内核框架构建了全系统&#xff0c;是云计算、运维和安全等领域技术创新的基础。 龙蜥社区在 eBPF 领域进行了广泛的实践…...

屏幕截图软件 Snagit mac中文版软件特点

Snagit mac是一款屏幕截图和视频录制软件&#xff0c;它可以帮助用户快速捕捉屏幕上的任何内容&#xff0c;并将其编辑、标注和共享。 Snagit mac软件特点 多种截图模式&#xff1a;支持全屏截图、窗口截图、区域截图、延时截图等多种截图模式&#xff0c;满足不同用户的需求。…...

四、Ribbon负载均衡

目录 一、负载均衡流程 1、我通过浏览器直接访问userservice/user/1&#xff0c;无法访问&#xff0c;说明是负载均衡做了相应的处理 2、我们来看一下代码中负载均衡的流程是怎样的 3、图像流程 二、负载均衡策略 1、修改负载均衡策略 &#xff08;方式一&#xff09; &a…...

【Git】第二篇:基本操作(创建本地仓库)

我们知道&#xff0c;git是一个版本控制器&#xff0c;可以帮我们控制管理电脑上所有格式的文档。 而我们需要使用git管理文件的时候&#xff0c;我们必须将这些文件放到git仓库中&#xff0c;只有在git仓库中的文件才可以被我们的git追踪管理 创建本地仓库 创建本地仓库是需…...

vuex——重置vuex数据

需求描述 登出系统时&#xff0c;需将 vuex 中存储的数据&#xff0c;恢复为最初的默认状态。 实现方法 通过 replaceState 方法&#xff0c;将最初的 vuex 的 state 数据作为参数传入即可 完整代码范例 src\store\index.js import Vue from "vue"; import Vuex fro…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...