一、引入环境变量
1.1 引入环境变量
main函数是有参数的,该参数就用来接收命令行参数的。当我们在执行文件的过程中,我们可以输入一些选项。
1.1.1 参数说明
argc
(argument count):表示命令行参数的数量,包括程序名。argv
(argument vector):是一个字符串数组,其中存储了所有命令行参数。argv[0]
是程序的名称,后续的argv[1]
、argv[2]
等是用户输入的参数。
当我们输入一些选项时, 这些选项是一个命令行字符串。当bash接收到这个字符串后,bash会将这个字符串进行切割,放入到一个命令行参数表中。该表就是main中的argv,我们可以通过遍历还证明这种情况。
1.1.2 为什么要有这个参数
我们可以通过不同的选项,让我们的同一个程序执行他内部的不同功能。我们在Linux系统中使用ls指令时,就会有多个选项可以使用。
因此,命令行参数就是Linux指令选项的基础。
1.2 环境变量的概念
- 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数
- 比如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们所链接的动态库和静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
- 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性y
- 环境变量不是一个,而是一堆,彼此之间没有任何关系,一般都是系统内置的具有特殊用途的变量
定义变量的本质就是开辟空间,在运行期间,我们的程序也可以开辟空间,操作系统/bash是用C语言写的程序,也可以在运行中开辟空间,在系统的环境变量,本质就是系统自己开辟空间,给他名字和内容即可。
二、常见的环境变量
- PATH:指定命令的搜索路径
- HOME:指定用户的主工作目录(即用户登录到Linux系统中时,默认的目录)
- SHELL:当前Shell,他的值通常是/bin/bash
三、查看环境变量的方法
3.1 引入
我们一般在Linux操作系统中运行可执行文件时,我们需要在可执行文件前加入该文件所在的路径,但是我们在执行一些系统指令时,我们不用在其前面加上路径呢?因为在环境变量,系统中的指令的路径都在环境变量中保存着。
如果我们也想将自己写的可执行文件直接就能执行,也需要将该文件的路径加入到环境变量中。那么如何才能加入该环境变量中呢?
3.2 与环境变量相关的命令
- echo:显示某个环境变量值
- export:设置一个新的环境变量
- env:显示所有的环境变量
- unset:清除环境变量
- set:显示本地定义的shell变量和环境变量
3.3 环境变量的组织方式
每一个程序都收到一个环境表,环境表就是一个字符指针数组,每一个指针指向一个以“\0”结尾的环境字符串。
四、如何获取或设置环境变量
4.1 命令行第三个参数
#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;
}
4.2 通过第三方变量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;
}
4.3 通过系统调用
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%s\n", getenv("PATH"));
return 0;
}
4.1 getenv函数介绍
getenv
函数用于获取环境变量的值。它的原型在<stdlib.h>
头文件中定义,返回指定环境变量的字符串值。语法
char *getenv(const char *name);
参数
name
:要查询的环境变量的名称(字符串)。返回值
- 如果环境变量存在,返回其值的指针。
- 如果环境变量不存在,返回
NULL
。
4.2 putenv函数介绍
putenv
函数用于设置或更改环境变量。它的原型在<stdlib.h>
头文件中定义。语法
int putenv(char *string);
参数
string
:格式为"VAR=value"
的字符串,其中VAR
是环境变量的名称,value
是要设置的值。返回值
- 成功时返回
0
。- 失败时返回
-1
,并设置errno
。
五、环境变量的特点
环境变量具有全局属性,环境变量会被所有的子进程包括孙子进程进行继承。我们可以使用fork函数创建出父子进程,可以分别打印出父子进程的环境变量。