Chinaunix首页 | 论坛 | 博客
  • 博客访问: 968706
  • 博文数量: 200
  • 博客积分: 5011
  • 博客等级: 大校
  • 技术积分: 2479
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-27 15:07
文章分类

全部博文(200)

文章存档

2009年(12)

2008年(190)

我的朋友

分类:

2008-11-18 15:42:27

7.5 environment list

有一个全局变量environ,它指向了一个字符串数组,每个元素就是一个char*。里面成方了所有的环境变量,格式为:xxx=yyyyy

注意,全局变量,也仅仅是在这个进程里面全局,你修改它是可以的,不过不会影响到别的进程。

以下内容实际是7.9的内容,它综合了7.57.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 5.2.1

Linux 2.4.22

Mac OS X 10.3

Solaris 9

getenv

putenv

 

XSI

setenv

 

 

unsetenv

 

 

clearenv

 

 

 

 

 

 

阅读(641) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~