ISO C定义了一个函数getenv,可以用其取环境变量值。
#include <stdlib.h> char* getenv(const char* name); //返回与name关联的value的指针,若没有找到则返回NULL。
除了取环境变量的值,有时也需要设置环境变量,但是不是所有的系统都支持,详细如下图:
clearenv不是SUS的组成部分,它被用来删除环境表中的所有项。
表中的三个函数原型是:
#include <stdlib.h> int putenv(char *str); //将name=value的字符串放到环境表中,如果name已经存在,则先删除其原来的定义。 int setenv(const char* name, const char* value, int rewrite); //将name设置value,如果name已经存在,那么(a)若rewrite非0,则首先删除其现有定义,(b)若rewrite为0,不删除 //现有定义,不设置新的value,也不出错。 int unsetenv(const char*name); //删除name的定义,如果不存在name也不出错。
三个函数返回值:如果成功则返回0,出错返回非0值。
环境表和环境字符串通常存放在进程存储空间的顶部,删除一个字符串很简单,只要现在环境表中找到该指针,然后将所有
后续指针都向环境首部顺次移动一个位置。但是增加一个字符串或者修改一个现有的字符串就困难的多。环境表和环境字符
串通常占用的是进程地址空间的顶部,所以不能再向高地址方面扩展,同时也不能移动在它之下的各栈帧,所以它也不能向
低地址方向扩展。
典型的存储器分配安排如下图所示:
1.如果修改一个现有的name:
a.如果新的value的长度少于或者等于现有value的长度,则只要在原字符串所用空间中写入新字符串。
b.如果新value的长度大于原长度,则必须调用malloc为新字符串分配空间,然后将新字符串复制到该空间,接着使环境
表中针对name的指针指向新分配区。
2.如果要增加一个新的name,首先调用malloc为name=value字符串分配空间,然后将该字符串复制到此空间中。
a.如果这是第一次增加一个新name,则必须调用malloc为新的指针表分配空间。接着将原来的环境表复制到新分配区,
并将指向新name=value字符串的指针存放在该指针表的结尾,然后又将一个空指针存放在其后。最后是environ指向新
指针表。
b.如果这不是第一次增加一个新name,则可知以前已调用malloc在堆中为环境标准分配了空间,所以只要调用realloc,
以分配比原空间多存放一个指针的空间。然后将指向新name=value字符串的指针存放在该表表尾,后面跟着一个空指针。