环境变量与程序地址空间
环境变量
环境变量简介
基本概念
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性
常见环境变量
1.PATH : 指定命令的搜索路径
2.HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
3.SHELL : 当前Shell,它的值通常是/bin/bash。
可以通过echo $名称(查看你的环境变量)
和环境变量相关的命令
1. echo: 显示某个环境变量值
2. export: 设置一个新的环境变量
3. env: 显示所有环境变量
4. unset: 清除环境变量
5. set: 显示本地定义的shell变量和环境变量
环境变量相关的代码和组织方式
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串
可以通过命令行的第三个参数来查看当前的环境变量
#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;
}
当然也可以使用getenv来获取
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%s\n", getenv("PATH"));
return 0;
}
程序地址空间
我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理
地址空间:是对物理内存的一种虚拟化表示。虚拟空间最终一定要以某种方式转化到物理内存。
根据上图每一个PCB都会又一组进程地址空间犹如上图,但他们不是直接存储在物理内存当中,而是通过某些方式来映射到物理内存当中。
上面的图就足矣说名问题,同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到了不同的物理地址!
说白了进程地址空间就是一个struct结构体,里边定义的形式类似图上
通过这样来组成进程空间地址。
每一个进程有自己的进程空间地址然后通过页表进行虚拟地址和物理地址的转变。
意义:以为直接存储在物理内存容易混乱,容易浪费空间。例子:我们分三天存银行钱第一天存了10.5,第二天存了5.5,第三天存了1.2我们取钱要取10元这样如果不连续存储就没有办法得到合适的10元页表就解决了这个问题存钱的时候通过第三方来统计然后进行连续存储(虚拟地址是连续的其实映射到物理内存是分布的)。