2017-02-24 25 views
4

我想看看我在execve()函數中傳遞的環境變量是否真的被傳遞了,所以我做了這段代碼(Main.c):找不到傳入execve函數的env

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發佈的二進制文件,我得到這樣的輸出:

PATH:(空)

,而我希望看到

PATH:BIN

你有什麼解釋?

+2

那麼,'PATH'的大小爲3,但是你複製了一個長度爲4的字符串(記住NUL終止符爲'\ 0'')... – StoryTeller

+0

對不起,我只是編輯了我的帖子,但解決了strcpy問題沒有改變:-( – juRioqs75

+0

歡迎使用堆棧溢出 請注意,在這裏說'謝謝'的首選方式是通過 增加投票的好問題和有用的答案(一旦你有足夠的聲譽這樣做, 聲譽) ,並接受任何 問題的最有幫助的答案,你問(這也給你一個小的提升你的 聲譽) 請參閱[關於]頁面,以及[我怎麼問問 ?](http ://小號tackoverflow.com/help/how-to-ask)和 [當有人回答我的問題 怎麼辦?(http://stackoverflow.com/help/someone-answers) –

回答

4
  1. 您的字符串緩衝區PATH對於您要放入其中的字符串來說不夠大。

  2. 環境字符串需要是"PATH=bin",而不僅僅是"bin"

  3. 正如其他答案所示,您需要結束帶空指針的環境字符串列表,即char *newenviron[] = {PATH, 0};

您可能會嘗試在修改程序之前檢查傳遞給您的程序的環境結構,以查看必要的格式。以下是如何執行此操作的示例:http://nibot-lab.livejournal.com/115837.html

+0

感謝,它的工作 – juRioqs75

+0

FWIW, OP在問題中修復了#1。 – Qix

4

環境字符串的格式必須爲VARIABLE_NAME=value of the variable

您的PATH變量(C變量,而不是環境變量)應該是一個字符串,其內容爲PATH=bin

此外,您需要結束一個額外的null(以及最後一個字符串附帶的null),以指示環境中不再有字符串。

execve(2)手冊頁(重點煤礦):

的參數envp也是一個指向字符指針的空終止陣列空終止字符串。這個數組的指針通常存儲在全局變量environ中。這些字符串將信息傳遞給新的進程,該進程並不直接是該命令的參數(請參閱environ(7))。

並從environ(7)手冊頁:

串稱爲環境的陣列由execve的提供(2)當一個過程開始。按照慣例,這些字符串具有「name = value」的形式。

+1

Upvote包含對手冊的引用! – nibot

+0

'兩個空位'令人費解。每個字符串需要由一個空字節(一種類型的null)終止,並且指向環境字符串的指針列表需要由一個空指針(另一種類型的空字符)終止。但是,這是我能想到的唯一含義,對於「兩個空值」是有意義的,從您的答案中可以看出您的意思並不明確。 –

+0

@JonathanLeffler這是正確的。我會澄清。 – Qix