环境变量是Linux C系统中,用于存储和管理系统运行时配置和状态的机制。常见的如PATH、HOME、SHELL都是系统中重要的环境变量,当然用户也可以自定义环境变量用于存储自己的配置和管理信息。
对于Linux环境,Linux C同样提供了一系列接口用于管理配置文件,这些接口在C语言库<unistd.h>提供,可以用于管理环境变量。
本节将进行env接口和使用方法的详细说明。
接口和功能
| |
|---|
getenv | |
setenv | |
putenv | |
unsetenv | |
clearenv | |
对于上述接口,其详细的说明如下所示。
// 获取系统环境变量// @name: 环境变量名称// @return: 环境变量的实际内容,失败返回NULLchar *getenv(constchar *name)// 添加和修改环境变量// @name: 环境变量名称// @value: 环境变量的值// @rewrite: 0表示不覆盖原变量,非0表示覆盖原变量// @return: 0表示成功,负值表示失败intsetenv(constchar *name, constchar *value, int rewrite)//写入环境变量,覆盖或者添加, 和setenv功能类似,实现上格式为name=string// @str: 指向一个字符串的指针,该字符串的格式为 "name=value",其中 "name" 是环境变量的名称,"value" 是环境变量的值// @return: 0表示成功,负值表示失败intputenv(char *str)// 删除环境变量// @name: 环境变量名称// @return: 0表示成功,负值表示失败intunsetenv(constchar *name)// 删除所有环境变量(仅进程内有效)// @return: 0表示成功,负值表示失败intclearenv(void)
其中setenv和putenv都可以用于添加和修改环境变量,其中setenv可以指定是否覆盖原变量,putenv则直接添加变量,存在则覆盖,不存在则创建。
另外,putenv会将指定的字符串直接写入环境变量表中,这就要求字符串所在内存区域在进程范围内都需要有效。而setenv会在内部自行创建副本,不需要依赖外部有效性。
一般来说,建议优先使用setenv来提高程序的健壮性。
示例和应用
对于环境变量的应用,如下所示。
#include<stdio.h>#include<stdlib.h>#include<unistd.h>intmain(int argc, char *argv[]){int res;// 删除所有环境变量(当前进程有效) clearenv();// 设置环境变量,不存在时创建 res = setenv("test_env", "test_env_value", 1);if (res != 0) {printf("setenv failed\n");return-1; }char *env = getenv("test_env");printf("getenv: %s\n", env);// 删除环境变量 unsetenv("test_env"); env = getenv("test_env");if (env == NULL) {printf("getenv: NULL\n"); }// 添加环境变量 putenv("test_env=test_env_value"); env = getenv("test_env");printf("getenv: %s\n", env);// 执行printenv命令printf("execvp printenv: \n"); execvp("printenv", (char *[]){"printenv", "test_env", NULL});return0;}
对于上述代码,具体执行结果如下所示。

总结说明
对于Linux C来说,环境变量是系统编程和日常运维中,用于进程间传递配置信息的关键机制。
在系统来说,同样支持一系列命令用于修改和管理环境变量,包括printenv、export、unset、env等。
对于env接口,具有继承性和单向性的特点,在使用中具有如下特征。
Fork:父进程fork后创建子进程时,子进程会获得父进程环境变量的副本Exec:调用exec系列接口时,未指定环境变量时,新进程会继承父进程的环境变量单向传递: 在子进程修改的环境变量,不会影响父进程的环境变量
学习和掌握env接口的处理,对于熟练操作环境变量,进行系统配置和运行管理,具有重要意义。