前一阵,系统的编译器从32位模式,更新到了64位模式,编译器也从交叉编译改成了直接编译。今天发现一个putenv函数使用上的bug.
系统中有环境变量定义文件,例如sm_sp.env中有:
SM_POLL_DELAY=500000
SM_POLL_RETRY_CNT=2
SM_MISMATCH_THRESHOLD=20
SM_CADI_RESET=1
程序中如下类似代码:
fd=fopen("sm_sp.env","r);
...
char line[200];
while(1)
{
if(gets(line,sizeof(line),fd) == NULL) break;
putenv(line);
.......
}
.....
char *val;
val=getenv("SM_MISMATCH_THRESHOLD");
//此处,getenv始终会返回NULL,将得不到环境变量的SM_MISMATCH_THRESHOLD值。
原因:由于putenv时的参数是变量line, putenv并不会添加新的环境变量,而是替换前一个环境变,最终有效的是仅设置了环境变量SM_CADI_RESET。
解决办法:
putenv处改用setenv(),环境变是就会做添加操作了。
putenv & setenv实际上修改的是extern char **environ变量。当前所有环境变量可以用如下代码读取:
for(int i=0;environ[i] != NULL; i++)
printf("%s\n", environ[i]);