我想看看我在 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
你有任何解释吗?
答案 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)
您的字符串缓冲区PATH不足以容纳您尝试输入的字符串。
环境字符串必须为"PATH=bin"
,而不仅仅是"bin"
。
正如另一个答案所示,您需要使用空指针结束环境字符串列表,即char *newenviron[] = {PATH, 0};
。
您可以尝试检查在修改程序之前传递给程序的环境结构,以查看必要的格式。以下是如何执行此操作的示例:http://nibot-lab.livejournal.com/115837.html