问题

我发现我直接使用如下程序,可以直接设置环境变量:

const char name1[6]="SHELL";
const char name2[8]="USENAME";
const char vaule[4]="zqh";
putenv("SHELL=zqh");
putenv("USENAME=zqh");
printf("%s\n", getenv(name1));
printf("%s\n", getenv(name2));

结果如下:

zqh
zqh

但是

当我使用函数的时候,自己将字符串赋值进去的时候,却无法修改环境变量:

int my_setenv(const char *name,const char *var)
{
char *pbuf = NULL;
if (getenv(name) == NULL)
{
printf("now add %s\n",name);
}
else
{
printf("now modfiy %s\n",name);
}
pbuf = (char *)malloc(strlen(name)+1 + strlen(var)+1 + 1);
if (NULL == pbuf)
{
return -1;
}
sprintf(pbuf, "%s=%s", name, var);
printf("pbuf %s\n",pbuf);
printf("putenv %d\n",putenv(pbuf));
free(pbuf);
return 0;
}


int main(int argc, char const *argv[])
{
const char name1[6]="SHELL";
const char name2[8]="USENAME";
const char vaule[4]="zqh";
my_setenv(name1,vaule);
my_setenv(name2,vaule);
printf("%s\n", getenv(name1));
printf("%s\n", getenv(name2));
return 0;
}

结果如下:

now modfiy SHELL
pbuf SHELL=zqh
putenv 0
now add USENAME
pbuf USENAME=zqh
putenv 0
[1] 7326 segmentation fault (core dumped) ./6-3
可以看出,设置变量貌似是成功了,但是当我想获取我设置的变量值时,就会出现segmentation fault的错误。这是由于我想printf一个NULL指针引发的。

这个就非常令人难受了,我在函数内打印pbuf的值,发现他的值的确是我要输入的值,但是却还是不能正确的putenv

修复过程

我现在尝试把东西放在主函数中运行,程序如下:

int main(int argc, char const *argv[])
{
const char name1[6]="SHELL";
const char name2[8]="USENAME";
const char vaule[4]="zqh";
char *pbuf=NULL;
pbuf=(char*)malloc(strlen(name1)+strlen(vaule)+1);
sprintf(pbuf,"%s=%s",name1,vaule);
printf("%s\n", getenv(name1));
putenv(pbuf);
printf("%s\n", getenv(name1));
return 0;
}

结果:

/bin/zsh
zqh
现在非常正常,但是为什么我放在函数中运行,就会失败呢?接下来我尝试继续使用函数。

使用函数:

现在我把他放到函数中:

int my_setenv(const char *pName,const char *pVar)
{
char *pbuf=NULL;
pbuf=(char*)malloc(strlen(pName)+strlen(pVar)+1);
sprintf(pbuf,"%s=%s",pName,pVar);
printf("%s\n", getenv(pName));
putenv(pbuf);
printf("%s\n", getenv(pName));
}

int main(int argc, char const *argv[])
{
const char name1[6]="SHELL";
const char name2[8]="USENAME";
const char vaule[4]="zqh";
my_setenv(name1,vaule);
return 0;
}

运行结果:

/bin/zsh
zqh

解决问题

很无语,现在写的这个函数,与原来没有什么区别,但是就是没有问题。所以这个问题我解决了,但是就好像没有解决一般。令人难受。