使用execve

时间:2017-03-05 22:59:50

标签: c execve

我想显示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,我得到了这个输出:

  

PATH   :AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA   USERNAME :( null)

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

2 个答案:

答案 0 :(得分:2)

您在newenviron数组的末尾错过了一个空终结符。此外,您还要为每个字符串再写一个字节,而不是为此分配空间(结尾\ 0计为字符)。

答案 1 :(得分:0)

Oups my bad,我删除了USERNAME标签的“USERNAME =”部分,因为循环从 1 开始,而不是 9 ......