基本概念
环境变量Environmental variables一般是指在操作系统中用来指定操作系统运行环境一些参数。
我们在编写C、C++代码时候,在链接的时候从来不知道我们所链接的动态、静态库在哪里。但是还是照样可以链接成功。生成可执行程序。原因就是相关环境变量帮助编译器进行查找。
环境变量通常具有某些特殊属性。还有在系统中通常具有全局特性。
main函数的参数
根据代码实例观察幂函数参数以及命令行参数列表之间的关系。可以想一想计算机的发展历史,Linux其实底层就是用c语言写的。那么各种指令也是要通过c语言写的,所以在命令行解释器中输入在命令行输入的一些指令。指令的选项,那么底层也是要通过Linux内核的指令可执行程序的main函数进行运行。
所以main函数参数:
- 第一个参数:是一个整数,表示命令行参数的个数,包括程序名本身。
- 第二个参数,参数向量是一个字符指针数组。argv[0]表示程序名,argv[1]表示第一个命令行参数,以此类推。
- 第三个参数,envp环境变量指针数组部分系统存在。是一个字符串指针数组用来传递环境变量的信息,每一个字符串指向以'\0'结尾的字符串表示环境变量。
main函数参数存在的原因。同一个程序可以根据命令行参数根据选项的不同表现出不同的功能。
main函数参数是谁传递的
输入的指令就是字符串shell命令行解释器拿到字符串。按照空格打算形成一张argv表和元素个数argc表。argv整个表示以null结尾的命令行启动的程序。附近全都是shell启动的命令与shell命令行是父子关系。父子进程具有独立性,子进程继承父进程的代码数据各自私有一份,尤其是数据只是只读子进程也能看到。
编译器,操作系统,加载器不是互相割裂的,彼此是有关系的。
常见环境变量
Path指定命令的搜索路径。
为什么系统中的指令可以直接执行,不需要带路径,但是我们写的二进制程序就需要带路径才能执行。这是因为系统的指令所在的路径。是存在于环境变量中的path路径中的。
Home指定用户的主工作目录。即用户登录到Linux系统中时默认目录。
Shell当前shell它的值通常是/bin/bash。
查看环境变量方法
bash
echo $环境变量名称
和环境变量相关的命令
Echo显示某个环境变量值。
bash
echo $PATH
Export设置一个新的环境变量。
bash
export a
更改环境变量
如果想要更改的环境变量永久存在,那么就要在配置文件中更改。
env显示所有环境变量。
Unset清除环境变量。
Set设置本地的shell变量和环境变量。
环境变量的组织方式
- 环境变量最开始都是在系统的配置文件中的。
- 登录系统启动一个shell进程操作系统读取用户和系统相关的环境变量的配置文件。
- 但是自己形成环境变量表,然后由子进程进行读取。
- 每个程序都会收到一张环境变量表,环境变量表是一个字符串指针数组,每一个指针指向以`/0´结尾的环境字符串。
通过代码如何获取环境变量
命令行第三个参数
cpp
#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获取
cpp
#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;
}
libc中定义的全局变量,environ指向环境变量表environ没有包含在任何头文件中,所以要使用时要加上extern声明。
通过系统调用获取设置环境变量
cpp
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%s\n", getenv("PATH"));
return 0;
}
常用getenv和putenv函数来访问特定的环境变量。
环境变量通常是具有全局性的
cpp
#include <stdio.h>
#include <stdlib.h>
int main()
{
char * env = getenv("MYENV");
if(env)
{
printf("%s\n", env);
}
return 0;
}
环境变量可以被所有bash之后的进程全部看到,所以进全局环境变量具有全局属性。系统的配置信息,尤其是指导性的配置信息环境变量是系统配置起效的一种表现。进程具有独立性,环境变量可以用来进程之间传递数据。
- 直接查看,发现没有结果,说明该环境变量根本不存在。
- 导出环境变量
- export MYENV="hello world" 再次运行程序,发现结果有了!说明环境变量是可以被子进程继承下去的!