标签:linux编程
每个进程在启动的时候都会收到一张环境表。环境表是由一个字符指针数组组成,每个指针包含一个以NULL结束的字符串的地址,全局变量environ包含了指针数组的地址:在linux中,环境变量由:name=value这样的字符串组成,下图是一个由5个环境变量组成的环境表结构:
如果是查看整个环境需要使用environ变量,如果只读取某个变量可以使用getenv和pucenv函数。
#include <stdlib.h> char *getenv(const char *name);
说明:
函数的返回值是name=value中value字符串的地址,若未找到则返回NULL。
#include <stdlib.h> int putenv(char *str); int setenv(const char *name, const char *value, int rewrite); int unsetenv(const char *name);说明:
setenv必须分配存储区,以便依据其参数创建name=value字符串。同时,putenv则无需将传送给它的参数字符串直接放到环境中。
注意:在使用putenv时,将存放在栈中的字符串作为参数传送给该函数时就会发生错误,其原因是,从当前函数返回时,其栈帧占用的存储区可能将被重用。
进程中的环境表和环境字符串通常放在进程存储空间的顶部。删除一个字符串很简单,只要在环境表中将字符串删除后将其后续的指针向环境表的顶部顺序移动一个位置即可;但增加或修改一个字符串则不同,因环境表通常占用进程地址空间的顶部,不能再向高地址方向(向上)扩展,也不能移动在它之下的个栈帧,所以也不能向低地址方向扩展。两者组合使得该空间的长度不能在增加。
如果新的value的长度少于或等于现有的value的长度,则只需直接修改其源内容即可。 如果新value的长度大于源长度,则必须调用malloc为新字符串分配空间,然后将name的指针指向新的字符串。
如果是第一次增加环境变量,则在给新的环境变量分配空间后需要将环境表复制到新的分配区,也就是重新为环境表分配一个空间,然后将新的环境变量的地址存放在环境表的表尾,最后在在环境表的尾部添加一个空指针即可。当然,需要将environ指向新的环境表。
如果不是第一次增加环境变量,则只需要将新的环境变量的地址添加进环境表的尾部,在在环境表的尾部增加一个新的空指针即可。
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:linux编程
原文地址:http://blog.csdn.net/xuwq2015/article/details/46944703