分类:
2008-11-18 15:42:27
7.5 environment list
有一个全局变量environ,它指向了一个字符串数组,每个元素就是一个char*。里面成方了所有的环境变量,格式为:xxx=yyyyy
注意,全局变量,也仅仅是在这个进程里面全局,你修改它是可以的,不过不会影响到别的进程。
以下内容实际是7.9的内容,它综合了7.5和7.6的内容。
讲述了environment variable的内存布局以及使用。
Environment variable list是一个字符串指针数组,由全局变量environ指向,我们不推荐直接对environ操作,因此出现了一些函数。
Environ指向的数组以及每个数组元素指向的字符串都位于7.6中的图所示,位于stack之上,由于stack的空间是定死的,那么如果你给environment variable list增加一个变量,或者修改一个变量使其数值超过了以前的长度,那么就必须要在heap里分配空间了。
1.如果修改一个变量的值比旧值小,那么只需将新的值拷贝到老的值所在的空间
2.如果修改一个变量的值比旧值长,那么就在heap里分配一个串保存xxx=yyy这个内容,然后让该变量的指针指向这个heap里的位置。
3.如果删除一个变量,那么只需将变量数组中一个成员删除,或者说将其后面的前移,所做的仅仅是若干个字节的复制操作。
4.如果增加一个变量,就必须要在heap里分配一个数组,将老的数组成员的值拷贝进来,然后将新的变量指针也加进来,且新的变量串也是在heap里分配的。最后一个数组成员一定是0。
如下是几个操作函数:
#include char *getenv(const char *name); |
Returns: pointer to value associated with name, NULL if not found |
#include int putenv(char
*str); int
setenv(const char *name, const char *value, int rewrite); int
unsetenv(const char *name); |
All return: 0 if OK, nonzero on error |
注意,putenv函数的参数str的值指向的空间就作为了新的变量的空间,而不会令分配新的空间,所以一定要保证我们这个str指向的空间不能是stack上的,而且不能随意删除。而setenv就没有这个限制。
Figure 7.8. Support for various environment list
functions |
||||||
Function |
ISO C |
POSIX.1 |
FreeBSD |
Linux |
Mac OS X 10.3 |
Solaris 9 |
getenv |
• |
• |
• |
• |
• |
• |
putenv |
|
XSI |
• |
• |
• |
• |
setenv |
|
• |
• |
• |
• |
|
unsetenv |
|
• |
• |
• |
• |
|
clearenv |
|
|
|
• |
|
|