putenv的坑

博客讲述了在系统升级为64位模式并改变编译方式后,遇到putenv函数导致环境变量设置错误的问题。程序读取环境变量文件,并通过putenv逐行设置环境变量,但最后只保留了最后一个变量。原因是putenv会覆盖而非添加环境变量。解决方案是使用setenv函数来确保添加新的环境变量。文章还提到了如何查看所有环境变量及extern char**environ的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前一阵,系统的编译器从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]);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值