读书人

linux环境变量操作解决方案

发布时间: 2013-02-05 10:40:57 作者: rapoo

linux环境变量操作
《Unix环境高级编程》中第七章讲到,对环境变量进行操作的函数有:
putenv---取形式为“name=value”的字符串,将其放到环境表中。
setenv---将name设置为value。
unsetenv---删除name的定义。

并且有下列一段话:
注意putenv和setenv的区别。setenv必须分配存储区,以便依据其参数创建“name=value”的字符串。同时,putenv则无需将传送给它的参数字符串直接放到环境中

我先问下,这个地方是不是说反了?

还有一个问题。
书上将增加一个字符串和修改一个现有的字符串要困难得多。环境表和环境字符串通常占用的进程地址空间的顶部,所以不能像高地址方向(向上)扩展;同时不能移动在它之下的各栈帧,所以不能向低地址方向(向下)扩展。两者组合使得该地址空间的长度不能再增加。

这个地方,为什么不能移动在它之下的各栈帧呢? linux unix
[解决办法]
你man一下吧。
[解决办法]
putenv和setenv的内部操作时不同的!
楼主都说清楚了,下面的图可以更清楚的显示这个过程(省略了查找和删除原有变量的过程)



int putenv(char *string);
----------

[解决办法]
env[0]
[解决办法]
---
----------

[解决办法]
env[1]
[解决办法]
---
----------

[解决办法]
env[2]
[解决办法]
---
----------

[解决办法]
env[3]
[解决办法]
---
----------

[解决办法]
env[4]
[解决办法]
---> string
----------

[解决办法]
......
[解决办法]

----------

[解决办法]
NULL
[解决办法]

----------


int setenv(const char *name, const char *value, int overwrite);
----------

[解决办法]
env[0]
[解决办法]
---
----------

[解决办法]
env[1]
[解决办法]
---
----------

[解决办法]
env[2]
[解决办法]
---
----------

[解决办法]
env[3]
[解决办法]
---
----------

------解决方案--------------------


env[4]
[解决办法]
---> newstr = malloc(strlen(name) + strlen(value) + 1 + 1);
---------- strcpy(newstr, name), strcat(newstr, "="), strcat(newstr, value);

[解决办法]
......
[解决办法]

----------

[解决办法]
NULL
[解决办法]

----------

读书人网 >UNIXLINUX

热点推荐