🎁个人主页:工藤新一¹
🔍系列专栏:C++面向对象(类和对象篇)
🌟心中的天空之城,终会照亮我前方的路
🎉欢迎大家点赞👍评论📝收藏⭐文章
环境变量
一、概念介绍
- 环境变量(environment variables)⼀般是指在 OS中⽤来指定 OS运行环境的⼀些参数
- 如:我们在编写 C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪⾥,但是照样可以链接成功,⽣成可执⾏程序,原因就是有相 关环境变量 帮助编译器进行查找
- 环境变量通常具有某些特用途,还有在系统当中通常具有全局特性
1.1 命令行参数
本质:使程序通过选项,实现不同子功能
- argc:有效子串个数
- argv[ ]:指针数组
./code:命令行参数的第一个参数
进程启动时,默认拥有一张表:argv
表,用来支持实现选项功能!
1.2 环境变量
执行命令之前[进程],必须要先找到它(由 bash
通过 环境变量[PATH] 进行查找工作)
PATH:默认存在于系统当中,系统搜索指令的默认搜索路径
系统当中存在环境变量(PATH),用来标识一串路径,以帮助我们找到目标二进制文件
我们自己写的二进制文件,没有经过测试的检验,强行放入系统路径下可能会污染系统原本的指令池
PATH:内存级别变量,关掉系统后自动恢复(相当于内部 malloc
一段内存空间:将PATH的内容和字符串保存起来)
如何理解环境变量?存储角度?
首先环境变量由名称&&内容构成,但最终环境变量的值被 bash
存储;当我们登陆时,系统就会为我们创建 bash进程
。bash
会从系统当中读取环境变量信息,并在 bash进程
内部形成一张 环境变量表
bash
内部有两张表:argv[]表 && 环境变量表
环境变量:key-val的常字符串
环境变量存储在 bash进程
的上下文中(变量a在进程的上下文中)
环境变量的来源(来自于哪儿?)
来源:系统的相关配置文件
配置文件中会直接/间接包含所有环境变量中的数据内容,当 bash启动时会从配置文件中读取所有环境变量的值,并在自己内部创建环境变量表
最后,如果Linux系统中同时有10个用户登陆呢?所以此时存在几个 bash呢?
我们运行的系统命令的父进程都是 bash,那么Linux中有10个用户登陆就要存在10个bash!这10个bash 每一个都要从配置文件中读到自己的 bash上下文中,那么每个 bash中也都要存在两张表:命令行参数表 && 环境变量表
指令的查找工作也是由 bash自己完成的
1.3 认识更多的环境变量
**环境变量:**在 OS中⽤来指定 OS运行环境的⼀些参数
1.4 获得环境变量的方法
指令:
代码段:
方法一:
获取父进程(bash)的环境变量,且环境变量可以被子进程继承
环境变量通常具有某些特殊用途,还有在系统当中通常具有 全局特性
那环境变量为什么可以被子进程继承?
方法二:getenv();
系统调用
需求:定制一个只有我能执行的程序(哪怕是root
都不行)
核心机制:环境变量的继承
答:因为我们可以将与环境变量相关的信息让子进程继承下去,子进程就可以结合环境变量来做个性化操作。比如:“定制一个只能让自己执行的程序”
通过环境变量,我们可以做一些 “进程级的数据传递和控制”,进而可以控制我们子进程的控制逻辑
环境变量数据貌似,默认是被我们共享的,单有一方子进程想更改环境变量的数据会发生写实拷贝
方法三:全局指针environ
每个程序都会收到⼀张环境表,环境表是⼀个字符指针数组,每个指针指向⼀个以’\0’结尾的环境
字符串
推荐方法二,因为一三获取的是环境变量列表,而我们需要的实际是具体某一个环境变量方便我们操作
1.5 环境变量的特性
- 环境变量具有全局性
本地变量:
–
环境变量在 bash
本地内部具有一定的功能性
环境变量其实是系统特定的全局变量,这些全局变量有特殊的用处,用来记录系统相关的信息(如:主机名?用户是谁?历史命令多少条?库/指令的所属路径是什么?)
所以,我们就理解了这些环境变量为什么能被我们的工具继承(gcc/g++
),gcc/g++
就可以拿着系统的环境变量去寻找动静态库,去做 C/C++ 的动态链接…
小结:
环境变量是一个相对比较孤立的话题,其与我们的进程没有直接关系;但存在简介关系(main函数传参存在参数表环境变量;环境变量使用时可以控制系统中传递给我们的进程,从而做相关处理)
对于环境变量我们得到有价值的事情:
- 我们执行的系统命令为什么不用带路径,而执行我们自主开发的命令需要带路径
- 我们需要知道 bash进程在用户登陆时会加载用户的配置文件,在bash环境变量内部存在两张表:命令行参数表[实现命令当中带选项 - 不同选项存在不同展现方式] && 环境变量表
- 环境变量可以被子进程继承,本地变量不会发生继承现象
🌟 各位看官好,我是工藤新一¹呀~
🌈 愿各位心中所想,终有所致!