环境变量
环境变量,是指在操作系统中用来指定操作系统运行环境的一些参数。通常具备以下特征:
- 其本质是字符串
- 有统一的格式:
名=值[:值]
- 值用来描述进程环境信息
- 存储形式:与命令行参数类似。
char *[]
数组,数组名environ
,内部存储字符串,NULL
作为哨兵结尾 - 使用形式:与命令行参数类似
- 加载位置:与命令行参数类似。位于用户区,高于
stack
的起始位置 - 引入环境变量表:需声明环境变量,
extern char **environ;
常用环境变量
环境变量名 | 作用 |
---|---|
PATH | 可执行文件的搜索路径。ls 命令也是一个程序,执行它不需要提供完整的路径名/bin/ls ,然而通常我们执行当前目录下的程序 a.out 却需要提供完整的路径名./a.out ,这是因为PATH 环境变量的值里面包含了ls 命令所在的目录/bin ,却不包含a.out 所在的目录。PATH 环境变量的值可以包含多个目录,用: 号隔开 |
SHELL | 当前 Shell,它的值通常是/bin/bash |
TERM | 当前终端类型,在图形界面终端下它的值通常是 xterm ,终端类型决定了一些程序的输出显示方式,比如图形界面终端可以显示汉字,而字符终端一般不行 |
LANG | 语言和locale ,决定了字符编码以及时间、货币等信息的显示格式 |
HOME | 当前用户主目录的路径,很多程序需要在主目录下保存配置文件,使得每个用户在运行该程序时都有自己的一套配置。 |
我们可以使用 echo
命令查看环境变量值:
我们也可以编写一个程序打印所有环境变量:
#include <stdio.h>
extern char **environ;
int main(void)
{
int i;
for(i=0; environ[i]; i++){
printf("%s\n", environ[i]);
}
return 0;
}
我们可以看到其打印了环境变量表:
环境变量操作函数
这里需要说明的是,当我们不知道一个函数的用途、返回值的含义或者需要的参数时,可以使用man
命令查看:
man getenv
- getenv 函数
# 获取环境变量值
char *getenv(const char *name);
# 成功:返回环境变量的值;
# 失败:返回NULL(name不存在)
- setenv 函数
# 设置环境变量的值
int setenv(const char *name, const char *value, int overwrite);
# 成功:返回0;
# 失败:返回-1;
这里参数 overwrite
取值:
0
:不覆盖原环境变量。(该参数常用于设置新环境变量)非0
:覆盖原环境变量。
这里失败的情况有两种:
- 传入的环境变量指针为空,或者环境变量名里有
=
号。 - 没有足够的存储空间去增加一个新的环境变量
- unsetenv 函数
# 删除环境变量 name 的定义
int unsetenv(const char *name);
# 成功: 返回0
# 失败:返回-1
这里失败的情况为:
- 传入的环境变量指针为空,或者环境变量名里有
=
号。
下面用一个实例来实验上面的函数:
setenv.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char *val;
const char *name = "ABD";
val = getenv(name);
printf("1, %s = %s\n", name, val);
setenv(name, "haha-day-and-night", 0);
val = getenv(name);
printf("2, %s = %s\n", name, val);
#if 0
int ret = unsetenv("ABDFGH");
printf("ret = %d\n", ret);
val = getenv(name);
printf("3, %s = %s\n", name, val);
#else
int ret = unsetenv("ABCEFJEW=");
printf("ret = %d\n", ret);
val = getenv(name);
printf("3, %s = %s\n", name, val);
#endif
return 0;
}
一开始环境变量表没有 ABD
,所以输出一个 null
,之后在环境变量表里添加一个新的环境变量 ABD
,因为是添加新的环境变量而不是覆盖,所以 overwrite
的值可以为 0
。之后在输出环境变量 ABD
的值就为 haha-day-and-night
。下面删除 ABCEFJEW=
,因为里面有 =
,所以失败,返回 -1
。