2017-03-05 50 views
0

我想顯示正在使用的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主和get.c獲得,並執行主,我得到這樣的輸出:

PATH :AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 用戶名:(空)

我不明白爲什麼用戶名爲空在這裏。

+0

你可以嘗試做'的printf(」 <%s> \ n開始「,USERNAME);'在第一個程序的循環中。你會看到它不包含你的想法。或者更好的是,學習如何使用調試器。 – rodrigo

+0

@WeatherVane咦? 'strcpy'是初始化它的東西。 –

+0

@JosephSible mybad,但仍然是循環中的最後一個'strcpy'將溢出數組,因爲終止''\ 0''。 –

回答

2

您在newenviron陣列末尾缺少空終止符。此外,你正在爲每個字符串多寫一個字節,而不是爲空間分配空間(結尾\ 0作爲一個字符)。

+0

你的意思就像'char * newenviron [] = {PATH,USERNAME,NULL};'?它不起作用... – SdFRO0QS78

+0

是的,你需要這樣做。 「不起作用」是什麼意思?你做什麼時發生了什麼?你是否修復了你的字符串大小? –

0

Oups是我不好,我抹去了USERNAME選項卡中的 「USERNAME =」 部分,因爲循環從而不是 ...

+0

arf!第二個printf顯示USERNAME但**也是** PATH,如何防止這個? – SdFRO0QS78

+0

正如已經告訴過你的,你錯過了零''0' –