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
上执行,所以有些值为空。
for(i=0;i<length;i++)
{
val = getenv(env_name[i]);
printf("%s = %s/n",env_name[i],val);
}
return 0;
}
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
函数用新的字符串地址来替换原来的地址,所以不能用分配在栈上的字符串地址。因为栈地址在函数返回时会重新利用,导致赋值错误。