1:进程环境
简介当一个进程(proecss) 调用另一个程序 (program) 时,同时会传递这个程序执行的环境列表 (environment list) 。
进程环境列表是一个字符指针数组,每个字符指针是一个以空字符(null-terminated) 结束的 C 字符串。
字符指针数组地址包含在全局变量environ 里。如下:
extern char **environ;
加入环境包含五个字符串,则表示为以下图示:
通常环境列表有名称--- 值对组成,名称为大写,大写只是约定的惯例。
要访问特定的环境变量不用environ 指针,通常通过函数 getenv 和 putenv 来访问。但是要访问整个环境变量就要用到environ 指针了。
2:进程环境操作函数
ISO C定义了一个函数可以用来取得环境列表值,前提是这个列表值要提前定义好。函数的头文件及函数原型为:
#include <stdlib.h>
char *getenv(const char *name);
Returns: pointer to value associated with name, NULL if not found
要去的特定的环境列表,用getenv 直接返回结果。比如,取得登录用户名为:
char * user = getenv("LOGNAME"); user 保存登录用户名。
3:以下是取得环境变量的例子:
程序中所用到的环境变量值由Single UNIX 所定义,程序在 ubuntu10.4 上执行,所以有些值为空。
4:操作环境变量:
以下函数可以操作环境变量值:getenv , putenv , setenv , unsetenv , clearenv 。 Linux 系统支持这 5 个函数,其他的 Unix 系统不全支持。
clearenv 不是 Single UNIX 规范 . 用来从 environment list 移除所有的值 .
函数头文件及原型如下:
#include <stdlib.h>
int putenv(char *str);
int setenv(const char *name, const char *value, int rewrite);
int unsetenv(const char *name);
All return: 0 if OK, nonzero on error
注意:
1:对于 setenv 函数,如果名称存在有以下两种情况: A: rewrit为 非0 ,存在的名称将会被移除。 B: rewrit为 0 ,为存在的名称更新值。
2: unsetenv 函数用来移除特定的环境值。
3: putenv 和 setenv 的差别。
setenv为环境列表参数分配内存来生成新的名称 --- 值对字符串。
putenv 用新的值字符串地址来替换原来的地址。因此,在 Linux 和 Solaris 上, putenv 函数用新的字符串地址来替换原来的地址,所以不能用分配在栈上的字符串地址。因为栈地址在函数返回时会重新利用,导致赋值错误。