【发布时间】: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("<%s>\n", USERNAME);。你会发现它不包含你的想法。或者更好的是,学习如何使用调试器。 -
@WeatherVane 嗯?
strcpy是它的初始化对象。 -
@JosephSible mybad,但由于
'\0'终止,循环中的最后一个strcpy仍然会溢出数组。