4

我想看看我在execve()函数中传递的环境变量是否真的传递了,所以我做了这段代码(Main.c):

int main(){

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

(get.c):

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

}

但是,当我执行 Main.c 发出的二进制文件时,我得到以下输出:

路径:(空)

而我想看

路径:垃圾箱

你有什么解释吗?

4

2 回答 2

5

环境字符串的格式必须为VARIABLE_NAME=value of the variable.

您的PATH变量(C 变量,而不是环境变量)应该是包含内容的字符串PATH=bin

此外,您需要用一个额外的 null 结束它(当然还有最后一个字符串附带的 null),以表明环境中没有更多的字符串。

execve(2)手册页(强调我的):

参数 envp 也是一个指向以空字符结尾的字符指针数组的指针,这些字符指针指向以空字符结尾的字符串。指向该数组的指针通常存储在全局变量 environ 中。这些字符串将不直接作为命令参数的信息传递给新进程(请参阅 environ(7))。

并从environ(7)手册页:

当进程开始时,execve(2) 提供了一个称为环境的字符串数组。按照惯例,这些字符串的格式为“name=value”。

于 2017-02-24T23:15:03.207 回答
4
  1. 您的字符串缓冲区 PATH 不足以容纳您尝试放入其中的字符串。

  2. 环境字符串需要是"PATH=bin",而不仅仅是"bin".

  3. 正如另一个答案所示,您需要以空指针结束环境字符串列表,即char *newenviron[] = {PATH, 0};.

您可以尝试在修改之前检查传递给程序的环境结构,以查看必要的格式。以下是如何执行此操作的示例:http: //nibot-lab.livejournal.com/115837.html

于 2017-02-24T23:13:01.510 回答