当前位置: 技术问答>linux和unix
linux环境变量操作
来源: 互联网 发布时间:2017-03-30
本文导语: 《Unix环境高级编程》中第七章讲到,对环境变量进行操作的函数有: putenv---取形式为“name=value”的字符串,将其放到环境表中。 setenv---将name设置为value。 unsetenv---删除name的定义。 并且有下列一段话: 注意putenv和s...
《Unix环境高级编程》中第七章讲到,对环境变量进行操作的函数有:
putenv---取形式为“name=value”的字符串,将其放到环境表中。
setenv---将name设置为value。
unsetenv---删除name的定义。
并且有下列一段话:
注意putenv和setenv的区别。setenv必须分配存储区,以便依据其参数创建“name=value”的字符串。同时,putenv则无需将传送给它的参数字符串直接放到环境中。
我先问下,这个地方是不是说反了?
还有一个问题。
书上将增加一个字符串和修改一个现有的字符串要困难得多。环境表和环境字符串通常占用的进程地址空间的顶部,所以不能像高地址方向(向上)扩展;同时不能移动在它之下的各栈帧,所以不能向低地址方向(向下)扩展。两者组合使得该地址空间的长度不能再增加。
这个地方,为什么不能移动在它之下的各栈帧呢?
putenv---取形式为“name=value”的字符串,将其放到环境表中。
setenv---将name设置为value。
unsetenv---删除name的定义。
并且有下列一段话:
注意putenv和setenv的区别。setenv必须分配存储区,以便依据其参数创建“name=value”的字符串。同时,putenv则无需将传送给它的参数字符串直接放到环境中。
我先问下,这个地方是不是说反了?
还有一个问题。
书上将增加一个字符串和修改一个现有的字符串要困难得多。环境表和环境字符串通常占用的进程地址空间的顶部,所以不能像高地址方向(向上)扩展;同时不能移动在它之下的各栈帧,所以不能向低地址方向(向下)扩展。两者组合使得该地址空间的长度不能再增加。
这个地方,为什么不能移动在它之下的各栈帧呢?
|
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 |
----------
|
你man一下吧。