环境变量

2014-07-31 08:42:29   最后更新: 2014-07-31 18:04:49   访问数量:1375




每个程序都会接收到一张环境表,与参数表一样,环境表也是一个字符指针数组,其中每个指针包含一个以null结尾的C字符串的地址,全局变量environ指向该指针数组的首地址

 

extern char ** environ;

 

 

如图所示:

 

通常,使用 getenv 和 putenv 两个函数来访问特定的环境变量,而不是用 environ 变量,但是如果要查看整个环境,则必须使用environ指针

 

环境变量字符串的形式通常如下:

name=value

习惯上通常name为大写

 

UNIX内核并不查看这些字符串,他们的解释完全取决于各个应用程序。例如,shell使用了大量的环境变量,其中某一些在登录时自动设置(如HOME,USER等),有些则由用户设置。

我们通常在一个shell启动文件中设置环境变量以控制shell的动作。例如,如果用户设置了环境变量MAILPATH,则告诉shell到哪里去查看邮件。

 

Single UNIX Specification定义的环境变量
环境变量意义
HOME 起始目录
LANG 本地字符编码
LCALL 本地名
LCCOLLATE 本地排序名
LCCTYPE 本地字符分类名
LCMONETARY本地货币编辑名
LCNUMERIC 本地数字编辑名
LCTIME 本地日期/时间格式名
LOGNAME 登录名
NLSPATH 消息类模板序列
PATH 搜索可执行文件的路径前缀表
TERM 终端类型
TZ 时区信息

  • 并不是所有UNIX系统都支持上述所有变量

 

char *getenv(char *name);

 

定义于stdlib.h头文件中,如果找到则返回指向name关联的value的指针,如果未找到则返回NULL

通常我们应当使用getenv从环境中取得一个环境变量,而不是直接访问environ

 

putenv

int putenv(char *envvar);

 

定义于stdlib.h头文件中,如果成功调用返回0,否则返回非0值

envvar取形式为name=value的字符串,将其放到环境变量中

 

setenv

int setenv(const char *name,const char * value,int rewrite); 

 

定义于stdlib.h头文件中,调用成功返回0,出错返回-1

 

将环境变量name设置为value

如果name已经存在且rewrite非0,则首先删除其现有定义并设置为value

如果name已经存在且rewrite为0,则不改变环境变量name的值,函数直接返回0

用上述两个函数修改的环境变量只对当前进程有效,而不会反映到外部空间中,以保证整个环境的安全

 

int unsetenv (const char *name);

 

定义于stdlib.h头文件中,调用成功返回0,出错返回-1

 

环境表以指向name=value的字符串的指针数组形式存储在进程存储空间的 顶部(栈只上),删除环境变量的方法就是直接删除对应的指针,创建的方法是malloc一个新的环境表分配区,然后将原来的环境表重新复制到新的环境表区,然后将新的指针放到新的环境表的表尾,指向malloc出来的新的字符串

 






读书笔记      技术帖      linux      unix      c语言      龙潭书斋      environ      environment      环境变量     


京ICP备15018585号