C语言环境变量接口

最近在分析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)而没有加锁,所以当多个线程访问的时候会出现错误.

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值