Linux环境变量操作函数
getenv - get an environment variable
#include <stdlib.h>
char *getenv(const char *name);
//Returns:与name相关的value的指针, NULL if not found
- 我们应该总是使用
getenv
来获取环境的特殊值,而不是直接访问environ
- 下章我们会知道我们可以仅仅影响当前进程和其子进程的环境
- 我们不能影响父进程的环境,父进程经常是shell
- 环境变量删除容易,增加难(栈上面存放环境变量的空间是无法扩充的)
ISO C没有定义任何环境变量。一些环境变量是由单一Unix规范的POSIX.1定义的。
单一Unix规范定义的环境变量如下:
putenv - change or add an environment variable
#include <stdlib.h>
int putenv(char *string);
int setenv(const char *name, const char *value, int overwrite);
int unsetenv(const char *name);
//Returns: 0 if OK, nonzero on error
int clearenv(void);
putenv
:用形式为name=value
的字符串放入环境列表,如果已经存在,则替换旧值
setenv
:set name
to value
. 如果name
已经存在,若overwrite
为真,已经存在的值被覆盖。如果overwrite
为假,name
不变,name
值不变为value
,且不产生error
unsetenv
:移除任何name
的定义。如果定义(definition)不存在,不产生错误
clearenv
:移除environment list
的所有entries
putenv和setenv的区别
- setenv必须分配空间给
name = value
string - putenv是直接将参数传给环境
- 如果
putenv
传入的string是在stack
上分配的,会出错。
修改、增加环境变量的几种情况
- 如果我们修改环境变量
- 新值尺寸小于等于旧值尺寸,直接复制
- 反之,
malloc
获得新string的空间,替代环境列表中旧的指针
- 增加新name
- 第一次增加新值,在heap上给
environment list
分配空间 - 不是第一次,之前已经为
环境列表
在heap上分配了新空间,直接调用realloc
分配更大的空间来保存更多的pointer
- 第一次增加新值,在heap上给