首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Linux】借命令行参数的引导,探索环境变量的奥秘

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

作者头像
用户11316056
发布于 2024-10-16 01:32:26
发布于 2024-10-16 01:32:26
16900
代码可运行
举报
运行总次数:0
代码可运行

1.命令行参数

1.1.概念:

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

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

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

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

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

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()函数第三个参数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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获取
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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的速度

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Linux系统#2】进程详解:命令行参数、环境变量及地址空间
🌈之前在这篇文章中【Linux】进程管理:状态与优先级调度的深度分析就已经简述了 进程的部分相关内容,下面我们来进一步深入了解进程的命令行参数以及环境变量和进程地址空间。
IsLand1314
2025/06/13
1090
【Linux系统#2】进程详解:命令行参数、环境变量及地址空间
linux-环境变量,进程地址空间
环境变量 (environment variables) 一般是指在操作系统中用来指定操作系统运行环境的一些参数
用户10923087
2024/08/04
1430
linux-环境变量,进程地址空间
万字讲解Linux进程概念
 有些书上对进程的描述是这样一句话:进程是在内存中的程序。一个运行起来(加载到内存)的程序称作进程。
二肥是只大懒蓝猫
2023/03/30
5970
万字讲解Linux进程概念
【Linux】进程详解:命令行参数、环境变量及地址空间
🌈之前在这篇文章中【Linux】进程管理:状态与优先级调度的深度分析就已经简述了 进程的部分相关内容,下面我们来进一步深入了解进程的命令行参数以及环境变量和进程地址空间。
IsLand1314
2024/10/15
2210
【Linux】进程详解:命令行参数、环境变量及地址空间
【Linux篇】环境变量与地址空间
我们会发现argv是一个变长数组,会把我们输入的内容呈现出来。实际上argv是一个指针数组。当我们在命令行中输入一个./code以空格作为分隔符,其实我们输入的时一个长字符串,我们把它叫做命令行或者命令行命令,其实就是一个字符串。当我们执行c语言程序时,这个字符串就会被切分成以空格作为分隔符,切成好几份,所以它把第一个字符串的地址填在argv[0]里面,依次类推。其中数组的有效元素个数就是argc
_孙同学
2025/03/18
1120
【Linux篇】环境变量与地址空间
[Linux]环境变量
为了满足不同的运行场景,操作系统预先设置了一大批全局变量,这种可以指定操作系统运行环境的变量就是环境变量。
始终学不会
2023/04/07
9970
[Linux]环境变量
进程优先级介绍,详解环境变量,详解进程地址空间
简单来说优先级是一种约定,进程都有优先级,优先级决定一个进程何时运行和接收多少 CPU 时间——优先级高的先做,优先级低的后做。
再睡一下就好
2025/06/11
680
进程优先级介绍,详解环境变量,详解进程地址空间
Linux_进程概念(B)-环境变量&进程地址空间【Linux】
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串
小志biubiu
2025/03/22
1010
Linux_进程概念(B)-环境变量&进程地址空间【Linux】
Linux进程概念(三)
我们所有写的程序都需要指定路径才能运行,就像这样:(程序里面是打印DLC循环)
有礼貌的灰绅士
2023/03/28
6040
Linux进程概念(三)
【Linux内核揭秘】深入理解命令行参数和环境变量
形如这样的命令后面带的选项就是命令行参数。 首先我们要了解一下命令行参数的原理。 我们知道像ls,mkdir,touch等等这些命令,都是用C语言写的可执行程序,所以必定会有main函数,我们以前学习C语言的时候也接触过一种main函数内部是传递参数的,学习C语言的时候,很难理解这些参数是什么意思,是因为这些参数是系统层面的,而不是语法层面的。 我们要理解命令行参数就需要先解决main函数的参数的问题。
用户11305458
2024/11/21
2100
【Linux内核揭秘】深入理解命令行参数和环境变量
Linux之环境变量
问题来了,为什么系统命令也是程序,但是执行它们时我们不需要带上路径,而我们自己的程序需要带上路径(例如:执行当前目录下的可执行文件test,需要用./test,'.'是当前路径的意思,因此是执行当前路径的文件test)。
摘星
2023/10/15
3840
Linux之环境变量
环境变量与命令行参数详解
​ 我们将其运行编译并生成为可执行文件 myproc ,当我们要运行它的时候,都得在这个可执行文件前面加一个 ./ 这是为什么?
利刃大大
2023/04/12
1.5K0
环境变量与命令行参数详解
「独立的浪漫」:进程与操作系统的优雅平衡
冯诺依曼体系结构(Von Neumann Architecture)是计算机的基本设计理念之一,由美国数学家约翰·冯·诺依曼于1945年提出,也被称为“冯诺依曼模型”或“冯诺依曼计算机体系结构”。它的核心思想是将程序和数据存储在计算机的内存中,并通过中央处理单元(CPU)执行程序。冯诺依曼体系结构至今仍然是大多数计算机的基础架构。
HZzzzzLu
2025/01/08
1310
「独立的浪漫」:进程与操作系统的优雅平衡
深入了解linux系统—— 进程控制
这是一个系统调用,创建子进程成功时,返回0给子进程,返回子进程的pid给父进程;创建子进程失败则返回-1给父进程。
星辰与你
2025/05/08
1410
深入了解linux系统—— 进程控制
Linux下C程序的存储空间布局,环境变量和命令行参数
命令行参数是指从命令行执行程序的时候,给程序的参数。C语言总是从main函数执行的,它的命令行参数被ISO C和POSIX规定为如下:
zy010101
2019/08/01
1.5K0
【Linux】进程概念(下)
什么是命令行参数呢?首先我们得先知道,主函数是可以传参的!而这个传给主函数的参数就是命令行参数。
YoungMLet
2024/03/01
2730
【Linux】进程概念(下)
【Linux】命令行参数和环境变量
当我们把程序换成之前的选项,发现该进程的ppid也是7241,也就是bash的子进程。 由此可以得出:命令行中启动的程序,都会变成进程,并且都是bash的子进程。
秦jh
2024/09/10
2490
【Linux】命令行参数和环境变量
【Linux】进程理解与学习Ⅲ-环境变量
在学习之前我们要先搞清楚这个概念,就比如说【y=ab+cd】,在这里,等号左边的就是变量,等号右边的则是变量的内容。变量是bash中非常重要的一个存在,在Linux下变量又分为自定义变量以及环境变量。本次章节讲对此做相关理解。
诺诺的包包
2023/03/27
9620
【Linux】进程理解与学习Ⅲ-环境变量
【Linux课程学习】:命令行参数,环境变量
3.对于父子进程,对于父进程只读的数据,不会修改的数据,不会拷贝一份,但是子进程可以看到。
用户11396661
2024/12/09
2190
【Linux课程学习】:命令行参数,环境变量
【Linux操作系统】环境变量和命令行参数
如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
MicroFrank
2023/02/02
2.1K0
【Linux操作系统】环境变量和命令行参数
推荐阅读
相关推荐
【Linux系统#2】进程详解:命令行参数、环境变量及地址空间
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档