日期:2014-05-16  浏览次数:20593 次

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] 
------解决方案--------------------
  ---
----------

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