1. 环境变量
环境变量用于描述该用户操作环境下特定意义的变量,可以用env命令查看该用户下生效的环境变量。 和命令行参数argv类似,环境变量表也是一组字符串,如下图12-8所示。
图12-8 环境变量图
libc库中定义的全局变量environ指向环境变量表,由于environ变量没有包含在任何头文件中,所以在使用时要用extern声明。
按照惯例,环境变量字符串都是name=value这样的形式保存在内存中。大多数name由大写字母加下画线组成,一般把name部分叫做环境变量名,value部分则是环境变量的值,而且value需要以'/0'结尾,环境变量定义了该进程的运行环境。
2. 打印环境变量
下面是打印环境变量的程序范例。
environ.c源代码如下:
#include <stdio.h>
int main(void)
{
extern char **environ;
int i;
for(i=0; environ[i]!=NULL; i++)
printf("%s/n", environ[i]);
return 0;
}
编译 gcc environ.c –o environ。
执行./environ,执行结果如下:
HOME=/home/zjkf
LANGUAGE=zh_CN:zh:en_US:en
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
......
在命令行执行时,Shell进程是执行进程的父进程。由于父进程在调用fork创建子进程后再调用exec函数执行environ程序,Shell进程会把自身的环境变量表复制给子进程,所以./environ打印的环境变量和Shell进程的环境变量是相同的。
3. 环境变量函数
(1) 环境变量函数
环境变量的使用会用到getenv、setenv、unsetenv这三个函数,这三个函数的原型及说明如下。
getenv(得到环境变量)
所需头文件
#include <stdlib.h>
函数说明
getenv()用来取得参数name环境变量的内容。参数name为环境变量的名称,如果该变量存在则会返回指向该内容的指针
函数原型
char * getenv(const char *name)
函数返回值
成功:返回指向该内容的指针
出错:NULL
setenv(改变或增加环境变量)
所需头文件
#include <stdlib.h>
函数说明
setenv()用来改变或增加环境变量的内容。参数name为环境变量名称字符串
函数原型
int setenv(const char *name,const char * value,int overwrite)
函数传入值
name:环境变量名称
value:环境变量的值
overwrite:
0表示该环境变量存在时,value则忽略
非0表示该环境变量存在时,原内容会被改为参数value所指的变量内容
函数返回值
成功:返回指向该内容的指针
出错:-1,错误原因存于errno中
错误代码
ENOMEM:内存不足,无法配置新的环境变量空间
unsetenv(删除环境变量)
所需头文件
#include <stdlib.h>
函数说明
unsetenv()用来删除环境变量
函数原型
void unsetenv(const char *name)
函数传入值
name:环境变量名称
(2)环境变量函数使用示例
getenv.c源代码如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char * p;
if((p=getenv("USER")))
printf("USER =%s/n",p);
setenv("USER","test",1);
printf("USER=%s/n",getenv("USER"));
unsetenv("USER");
printf("USER=%s/n",getenv("USER"));
return 0 ;
}
编译 gcc getenv.c -o getenv。
执行./getenv,执行结果如下:
USER =zjkf
USER=test
USER=(null)
(3)环境变量经常使用的场合
环境变量常使用得到一个文件的全路径名的场合。使用时需先在用户的.profile中设置FILEDIR=$HOME/print/;export FILEDIR。然后在程序中使用sprintf(file_full_name ,"%s%s",getenv("FILEDIR") ,filename )语句就可以得到文件的全路径名称,其中filename是文件名,file_full_name用来存放文件的全路径名称。
摘录自《深入浅出Linux工具与编程》
所需头文件
#include <stdlib.h>
函数说明
getenv()用来取得参数name环境变量的内容。参数name为环境变量的名称,如果该变量存在则会返回指向该内容的指针
函数原型
char * getenv(const char *name)
函数返回值
成功:返回指向该内容的指针
出错:NULL
所需头文件
#include <stdlib.h>
函数说明
setenv()用来改变或增加环境变量的内容。参数name为环境变量名称字符串
函数原型
int setenv(const char *name,const char * value,int overwrite)
函数传入值
name:环境变量名称
value:环境变量的值
overwrite:
0表示该环境变量存在时,value则忽略
非0表示该环境变量存在时,原内容会被改为参数value所指的变量内容
函数返回值
成功:返回指向该内容的指针
出错:-1,错误原因存于errno中
错误代码
ENOMEM:内存不足,无法配置新的环境变量空间
所需头文件
#include <stdlib.h>
函数说明
unsetenv()用来删除环境变量
函数原型
void unsetenv(const char *name)
函数传入值
name:环境变量名称