【问题标题】:Can't pass 2nd environment variable with execve无法使用 execve 传递第二个环境变量
【发布时间】:2017-03-05 22:59:49
【问题描述】:

我想显示 2 个使用 execve() 函数作为参数传递给另一个进程的环境变量:

Main.c:

int main(){


    char USERNAME[10];
    strcpy(USERNAME, "USERNAME=");
    for (int i=1;i<10;i++){
        strcpy(USERNAME+i, "1");
    }

    char PATH[169];
    strcpy(PATH, "PATH=");
    for (int i=5;i<169;i++){
        strcpy(PATH+i, "A");
    }


    char * newargv[] = {"./get","", (char*)0};
    char * newenviron[] = {PATH,USERNAME};
    execve("./get", newargv, newenviron);
    return 0;
}

get.c:

int main()
{
    const char* s = getenv("PATH");
    printf("PATH :%s\n",s);
    const char* s2 = getenv("USERNAME");
    printf("USERNAME :%s\n",s2);
}

所以我将 Main.c 编译为 Main 和 get.c 来获取,并执行 Main,我得到这个输出:

路径 :啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 用户名:(空)

我不明白为什么这里 USERNAME 是 NULL。

【问题讨论】:

  • 您可以尝试在您的第一个程序的循环中执行printf("&lt;%s&gt;\n", USERNAME);。你会发现它不包含你的想法。或者更好的是,学习如何使用调试器。
  • @WeatherVane 嗯? strcpy 是它的初始化对象。
  • @JosephSible mybad,但由于 '\0' 终止,循环中的最后一个 strcpy 仍然会溢出数组。

标签: c execve


【解决方案1】:

newenviron 数组末尾缺少空终止符。此外,您向每个字符串写入的字节比您分配的空间多一个字节(结尾的 \0 算作一个字符)。

【讨论】:

  • 你的意思是像char * newenviron[] = {PATH,USERNAME,NULL}; ?它不起作用...
  • 是的,您需要这样做。 “不起作用”是什么意思?你做的时候到底发生了什么?你修复了你的字符串大小吗?
【解决方案2】:

糟糕,我删除了 USERNAME 选项卡的“USERNAME=”部分,因为循环从 1 而不是 9...

【讨论】:

  • 啊!第二个 printf 显示 USERNAME 但也是 PATH,如何防止这种情况?
  • 正如已经告诉你的那样,你错过了尾随零\0
猜你喜欢
  • 1970-01-01
  • 2019-12-09
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 2021-06-25
  • 2018-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多