找不到env传入execve函数

时间:2017-02-24 23:05:21

标签: c execve

我想看看我在 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发出的二进制文件时,我得到了这个输出:

  

路径:( null)

而我希望看到

  

路径:bin

你有任何解释吗?

2 个答案:

答案 0 :(得分:5)

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

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

此外,您需要使用额外的null(以及最后一个字符串附带的null)来结束它,以指示环境中没有其他字符串。

execve(2)联机帮助页(强调我的):

  

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

并从environ(7)联机帮助页:

  

当进程开始时,execve(2)可以使用称为环境的字符串数组。按照惯例,这些字符串的形式为``name = value''。

答案 1 :(得分:4)

  1. 您的字符串缓冲区PATH不足以容纳您尝试输入的字符串。

  2. 环境字符串必须为"PATH=bin",而不仅仅是"bin"

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

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