最近在分析DLT源码时,遇到很多如下的代码:
getenv(DLT_USER_ENV_LOCAL_PRINT_MODE);
一些简单的配置可以通过环境变量实现。
getenv
getenv()读取环境变量的当前值的函数
原形:char *getenv(const char *name)
用法:s=getenv("环境变量名");
功能:返回一给定的环境变量值,环境变量名可大写或小写。如果指定的变量在环境中未定义,则返回一空串。
头文件:stdlib.h
用例:
char *strEnv ="";
strEnv = getenv( "TMP_DIR");
if( ( NULL == strEnv ) || ( 0 == strlen(strEnv ) ) )
{
//error
}
setenv
头文件 #include<stdlib.h>
定义函数 int setenv(const char *name,const char * value,int overwrite);
函数说明 setenv()用来改变或增加环境变量的内容。参数name为环境变量名称字符串。
参数 value则为变量内容,参数overwrite用来决定是否要改变已存在的环境变量。如果overwrite不为0,而该环境变量原已有内容会被改为参数value所指的变量内容。如果overwrite为0,且该环境变量已有内容,则参数value会被忽略。
返回值 执行成功则返回0,有错误发生时返回-1。
unsetenv
unsetenv()清除某个特定的环境变量的函数
函数定义:int unsetenv(const char *name);
另外,还有一个指针变量environ,它指向的是包含所有的环境变量的一个列表。
示例
#include<stdlib.h>
#include<stdio.h>
int main()
{
char * p;
int ret;
if((p=getenv("TEST")))
printf("TEST =%s\n",p);
ret = setenv("TEST","test",1);
printf("ret=%d,TEST=%s\n",ret,getenv("TEST"));
ret = setenv("TEST","test2",1);
printf("ret=%d,TEST=%s\n",ret,getenv("TEST"));
ret = setenv("TEST","test3",0);
printf("ret=%d,TEST=%s\n",ret,getenv("TEST"));
unsetenv("TEST");
printf("TEST=%s\n",getenv("TEST"));
}
测试结果如下:
需要注意的是,通过setenv设置的接口仅在当前进程生命周期是有效的,进程退出后设置的env就无效了。
#include<stdlib.h>
#include<stdio.h>
int main()
{
char * p;
int ret;
if((p=getenv("TEST")))
printf("TEST =%s\n",p);
ret = setenv("TEST","test",1);
printf("ret=%d,TEST=%s\n",ret,getenv("TEST"));
}
而且不同进程即使设置的同一个env,也互不影响。
#include<stdlib.h>
#include<stdio.h>
#include <unistd.h>
int main()
{
char * p;
int ret;
if((p=getenv("TEST")))
printf("TEST =%s\n",p);
ret = setenv("TEST","test",1);
printf("ret=%d,TEST=%s\n",ret,getenv("TEST"));
while(1)
sleep(1);
}
#include <stdio.h>
#include <stdlib.h>
int main ()
{
char **var;
char *str;
extern char**environ;
for (var =environ;*var !=NULL;++var)
printf ("%s\r\n",*var); // output all env
return 0;
}
这个用例用于打印全部的环境变量
总结
C语言提供了非常方便的环境变量设置和读取接口,设置的环境变量仅限于当前进程。这类接口一般用于读取全局环境变量作为参数配置使用,比如DLT中就大量使用环境变量作为作为配置。
UNIX高级环境编程中说到getenv函数是不可重入的,因为它用的是全局的静态存储区,由于对它进行了些操作(strcpy)而没有加锁,所以当多个线程访问的时候会出现错误.