实现一个setenv函数

操作系统
Published

May 23, 2018

问题

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

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

解决问题

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