【Linux】借命令行参数的引导,探索环境变量的奥秘

news2024/9/17 7:15:26

目录

1.命令行参数

1.1.概念:

1.2.利用命令行参数打造计算器:

2.环境变量

2.1.环境变量是什么?

2.2.有什么方法可以不用带路径,直接就可以运行自己的程序呢?

法一:

法二:

2.3.通过代码如何获取环境变量

main()函数第三个参数

通过第三方变量environ获取

3.进程地址空间:

3.1奇怪的现象:

3.2.用进程空间解释该现象

3.3.地址空间的原理

3.4.为什么要有地址空间+页表?

3.5.问题:malloc/new申请内存相关问题:

1.命令行参数

1.1.概念:

命令行参数是指在执行一个程序或命令时,通过命令行输入的附加信息和选项。

我们为什么会有不同的指令对应的不同的功能,就是因为命令行参数的存在,命令行参数就是Linux指令选项的基础!

注意我们的main()函数也是有参数的,且有三个参数,也就是命令行参数。

我们首先来研究main函数的前两个参数:一个整数类型的参数argc和一个字符指针数组类型的参数argv。其中,argc表示命令行参数的个数,同时也表示argv数组中元素的个数,而argv是一个指向参数值的指针数组,每个指针指向一个命令行参数的字符串

注意在argv数组存储的时候,默认第一个参数就是程序的名称。最后一个参数是NULL

字符串会被bash解析成一对多,放在指针数组里面,这些都是操作系统自己完成的!

如何获取环境?利用命令行传参,main函数第二个参数,会把所有环境参数都会被解析成一对多进行输出

所以我们可以通过不同的选项,让我们的同一个程序执行它内部不同的功能

1.2.利用命令行参数打造计算器:

int main(int argc, char* argv[], char* env[])
{
    // ./myprocess -add 1 2 有4个参数,所以argc == 4
    if (argc != 4)
    {
        printf("Usage:\n\t%s -[add|sub|mul|div] x y\n\n", argv[0]);
        return 1;
    }

    int x = atoi(argv[2]);
    int y = atoi(argv[3]);

    if (strcmp("-add", argv[1]) == 0)
    {
        printf("%d+%d=%d\n", x, y, x + y);
    }
    else if (strcmp("-sub", argv[1]) == 0)
    {
        printf("%d-%d=%d\n", x, y, x - y);
    }
    else if (strcmp("-mul", argv[1]) == 0)
    {
        printf("%d*%d=%d\n", x, y, x * y);
    }
    else
    {
        printf("unknown!\n");
    }
    return 0;
}

2.环境变量

2.1.环境变量是什么?

是由系统提供的全局变量,每一个环境变量都有它的系统和用途

这个概念很明显有点抽象,接下来给大家举几个例子,就能理解了。

我们知道,当我们运行自己的程序是都需要加上 ./ 而我们用 ls mv等指令却不需要加上 ./ 这是为什么呢?

这就跟我们其中的一个环境变量有关了,名叫PATH。在运行程序,系统会去用PATH中存的默认路径,通过路径去查找我们要执行的程序。ls mv等系统指令都是默认存放在这些路径当中,但是你自己写的程序默认路径不在环境变量中的路径,找不到就需要说明在当前目录 ./就是表明在当前目录!

查看环境变量:使用指令   echo $[环境变量]

以:分隔,都是一个一个子路径

2.2.有什么方法可以不用带路径,直接就可以运行自己的程序呢?

法一:

直接将我们的程序拷贝到PATH默认路径下的任意一个。这一操作相当于将自己的软件安装到系统当中了。这种方法并不推荐,会污染环境!

法二:

我们可以将当前路径添加到环境变量PATH当中,当成系统的子路径,这样也可以不用./ 可以直接执行!

指令: PATH=$PATH:想要添加的路径

注意环境变量具有全局属性,全局变量会被所有的子进程包括孙子进程进行继承!

2.3.通过代码如何获取环境变量

main()函数第三个参数

#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{
int i = 0;
for(; env[i]; i++){
printf("%s\n", env[i]);
}
return 0;
}

通过第三方变量environ获取

#include <stdio.h>
int main(int argc, char *argv[])
{
extern char **environ;
int i = 0;
for(; environ[i]; i++){
printf("%s\n", environ[i]);
}
return 0;
}

3.进程地址空间:

每一个进程都有自己的地址空间

3.1奇怪的现象:

父进程和子进程的值不同,但是为什么父进程和子进程的地址是一样的!?

3.2.用进程空间解释该现象

上图我们用红色框住的地址,绝对不是物理地址!不然地址不可能会相同的,这个地址叫做虚拟地址(线性地址)!

我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理,下面这张图对应的都是虚拟地址,同样也是我们的地址空间!

父进程和子进程地址都不变,但是经过页表映射关系访问了不同的内存,所以打印出来的值是不一样的

上面的图就足以说明问题:

同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到了不同的物理地址!

3.3.地址空间的原理

地址空间相当于就是操作系统给每一个进程画的大饼,所以并不会直接在物理内存中开辟空间,而是会用虚拟地址,当这个进程真正需要利用内存的时候,才会通过页表将虚拟内存映射到物理内存当中。

那么操作系统要不要对地址空间进行管理?当然是需要的,我们要先描述,再组织,进程地址空间是数据结构,具体到进程中,就是特定数据结构的对象!

区域划分的本质就是区域内的各个地址都可以使用,进行充分利用!

进程的地址空间一定有整数描述的各个区域,跟三八线用整数描述是一个道理。

在虚拟地址申请的内存空间不会立刻给你在屋里内存中申请,而是会等待你真正需要内存空间的时候才会在物理空间中开辟,地址空间相当于是一个支票,等到你需要的时候才会给你真正的申请空间

3.4.为什么要有地址空间+页表?

  • 将物理内存从无序变有序,让进程以统一的视角,看待内存
  • 将进程管理和内存管理进行解耦合
  • 地址空间+页表是保护内存安全的重要手段

我们的地址空间,不具备对我们的代码和数据的保存能力!是在物理内存中存放的。

页表的最大作用就是将地址空间上的地址(虚拟/线性)转化到物理内存当中!

我们当用malloc申请空间时,我们其实并没有在地址空间中申请,而是在地址空间上开辟空间,我们经过页表+物理内存映射,但是我们当前并没有建立映射关系,就会出现缺页中断!

缺页中断会暂停程序执行,将控制权交给操作系统内核。 内核会检查缺失的页面是否在磁盘上,并进行必要的页面置换。

3.5.问题:malloc/new申请内存相关问题:

1、申请的内存,你会直接使用吗

不一定

2、申请内存,本质是在哪里申请?

在进程的虚拟空间中申请。

注意操作系统一定要为效率和资源使用率负责,保证内存的使用率,不会空转,提升new或者malloc的速度

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

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

相关文章

PostgreSQL技术内幕9:PostgreSQL事务原理解析

文章目录 0.简介1.PG事务整体介绍1.1 事务类型介绍 1.2 事务模块介绍2. 代码分析 0.简介 有了上一篇数据库事务并发控制协议的介绍&#xff0c;对于数据库事务和并发控制有了基本的认识&#xff0c;本文将介绍PG事务模块&#xff0c;主要介绍PG支持的事务类型&#xff08;普通…

git为不同的项目设置不同的提交作者

方法1&#xff1a;找到项目的.git文件夹打开 打开config在下面添加自己作者信息 [user]name 作者名email 邮箱方法2&#xff1a;直接在.git文件夹设置作者名&#xff08;不使用–global参数&#xff09; git config user.name "xxxxx"如果想要修改之前提交的…

银行结算业务

1.1 银行本票 银行本票是由银行签发的,承诺自己在见票时无条件支付票款给收款人或持票人的业务。银行本票按票面划分为定额本票和不定额本票,按币种划分为人民币银行本票和外币银行本票。人民币银行本票仅在同一交换区域内使用,资金清算利用当地人民银行组织的资金清算形式…

vllm源码解析(五):LLM模型推理

八 模型推理细节探索 8.1 回顾下step的流程 def step(self) -> List[Union[RequestOutput, EmbeddingRequestOutput]]:# 多GPU并行推理时走AsyncLLMEngine分支。如果进入当前LLMEngine,性能会下降&#xff0c;这里会抛出异常。if self.parallel_config.pipeline_parallel_s…

基于机器学习的电商优惠券核销预测

1. 项目简介 随着移动互联网的快速发展&#xff0c;O2O&#xff08;Online to Offline&#xff09;模式已成为电商领域的一大亮点。优惠券作为一种有效的营销工具&#xff0c;被广泛应用于吸引新客户和激活老用户。然而&#xff0c;传统的随机投放方式往往效率低下&#xff0c;…

JavaWeb【day11】--(SpringBootWeb案例)

SpringBootWeb案例 前面我们已经实现了员工信息的条件分页查询以及删除操作。 关于员工管理的功能&#xff0c;还有两个需要实现&#xff1a; 新增员工 修改员工 首先我们先完成"新增员工"的功能开发&#xff0c;再完成"修改员工"的功能开发。而在&quo…

万能视频下载器-下载所有网站上的任何视频

万能视频下载器-下载所有网站上的任何视频 在Edge浏览器中发现了一款令人惊叹的视频下载扩展插件&#xff0c;简直就是视觉盛宴的利器&#xff01;只需轻点几下&#xff0c;在拓展商店中轻松查找并安装&#xff0c;你便能随时随地随心所欲地把心仪的视频收入囊中。无论是教学资…

matlab仿真 OFDM系统仿真

&#xff08;内容源自详解MATLAB&#xff0f;SIMULINK 通信系统建模与仿真 刘学勇编著第九章内容&#xff0c;有兴趣的读者请阅读原书&#xff09; clear all N8;%子载波数 f1:N;%各个子载波频率 xrandi([0 3],1,N);%子载波上的数据 x1qammod(x,4);%4-QAM调制 t0:0.001:1-0.…

学习周报-2024.9.3

目录 摘要 Abstract 文献阅读&#xff1a;一种改善河流水质预测的耦合模型以解决非平稳性和数据限制 一、现有问题 二、提出方法 三、相关知识 1、基于小波分析的LSTM&#xff08;WA-LSTM&#xff09; 2、迁移学习TL改进WA-LSTM 四、WA-LSTM-TL模型 五、研究实验 1、…

手写NACOS的服务的注册与发现|心跳机制|轮询调用服务功能

背景 手写NACOS的服务的部分核心功能&#xff0c;提高自身的编码能力 本篇文章设计的是单体NACOS后端服务&#xff0c;提供SDK给多个NACOS客户端使用 本文编写了注册与发现|心跳机制|轮询调用服务功能&#xff0c;可当做入门级阅读 nacos-service 项目结构 代码内容 pom配置…

Detect It Easy

Detect It Easy&#xff08;简称 DIE&#xff09;项目的网址为 https://github.com/horsicq/Detect-It-Easy 下载完安装包后&#xff0c;直接双击die.exe即可进入到操作界面 工具介绍&#xff1a; 它可以用来检测程序架构和文件类型。如图所示。其中&#xff0c;「模式」说明程…

UE5 贝塞尔曲线导弹

首先创建导弹Actor蓝图 代码逻辑&#xff0c;这其中创建的所有变量都不用添加值&#xff0c;这些逻辑要画图来解释&#xff0c;比较麻烦&#xff0c;大家自行理解一下 接下来进入人物蓝图编写代码逻辑&#xff0c;我这里是在两个不同的位置发射两枚导弹 宏中的代码&#xff0c;…

时序预测|基于粒子群优化支持向量机的时间序列预测Matlab程序PSO-SVM 单变量和多变量 含基础模型

时序预测|基于粒子群优化支持向量机的时间序列预测Matlab程序PSO-SVM 单变量和多变量 含基础模型 文章目录 一、基本原理1. 问题定义2. 数据准备3. SVM 模型构建4. 粒子群优化&#xff08;PSO&#xff09;5. 优化与模型训练6. 模型评估与预测7. 流程总结8. MATLAB 实现概述 二、…

Python QT实现A-star寻路算法

目录 1、界面使用方法 2、注意事项 3、补充说明 用Qt5搭建一个图形化测试寻路算法的测试环境。 1、界面使用方法 设定起点&#xff1a; 鼠标左键双击&#xff0c;设定红色的起点。左键双击设定起点&#xff0c;用红色标记。 设定终点&#xff1a; 鼠标右键双击&#xf…

轻松上手,高效产出:音频剪辑工具年度精选

不知道你有没有拍vlog记录生活的习惯&#xff0c;有时候视频里穿插进自己的声音能让视频更加丰富贴上自己的标签。这次我们一起探讨当下有哪些好用的在线音频剪辑工具。 1.FOXIT音频剪辑 链接直达>>https://www.foxitsoftware.cn/audio-clip/ 这个工具是一款专业的音…

GNU的伪操作 (25)

这里主要是 对 GNU的 各个伪操作进行 详细的解释。 先来看着几个 伪操作。 .byte, .short, .long, .quad , .float , 这个是关于 字节的。 .string .ascii 是关于字符串的。 这个字符串编译器是可以自动在末尾补0 的。 举例&#xff1a; val: .word 0x11223344 mov r…

计算机组成原理(SRAM电路图示)

1.该电路由6个MOS管&#xff08;T1-T6&#xff09;组成 2.T1-T4是一个由MOS管组成的触发器基本电路&#xff1b; T5&#xff0c;T6像开关&#xff0c;受行地址选择信号控制&#xff1b; T7,T8受列地址选择控制&#xff0c;分别与位线A&#xff0c;和相连 3.假设触发器…

FinOps原则:云计算成本管理的关键

导语&#xff1a; FinOps 原则为我们提供了北极星&#xff08;North Star&#xff09;&#xff0c;在我们实践云财务管理时指导我们的活动。这些原则由 FinOps 基金会成员制定&#xff0c;并通过经验磨练出来。 北极星&#xff08;North Star&#xff09;的含义&#xff1a; …

不用管理员权限直接修改windows中hosts值的方法

本文只适用于少数经常修改hosts文件的程序员帅哥和美女们。 背景&#xff1a;直接修改hosts文件的不足 修改C:\Windows\System32\drivers\etc\hosts时&#xff0c;必须要管理员权限。 经常修改&#xff0c;会觉得有一丝丝麻烦。 方法1 &#xff08;安全性低&#xff0c;不…

ThinkPHP5 5-rce远程代码执行漏洞复现

启动容器 docker-compose up -d 查看端口 docker ps 端口为:8080,访问网站&#xff0c;搭建成功 漏洞复现 &#xff08;1&#xff09;输出关于 PHP 配置的信息 &#xff08;2&#xff09;将php代码写入文件 接着访问shell.php 由于存在过滤&#xff0c;需要用到base64加密来使…