2011-06-08 41 views
3

Helllo大家,execvp參數

我有這樣的例子代碼:

pid = fork(); 
if (pid == 0) { 
    execvp(argv[2],&argv[2]); 
    perror("Error"); 
}else { 
wait(NULL); 

} 

man exec我明白

「的第一個參數,按照慣例,應該指向的文件名 與正在執行的文件相關聯「。

所以,如果我執行我的計劃是這樣的:

./a.out 5 ls 

命令ls將被執行。

第二個參數呢?手冊上說

「指針數組必須由一個NULL指針終止」我沒有在這裏看到一個NULL指針和我understan什麼是&argv[2]這裏的功能。

非常感謝!

回答

1

當您執行的a.out,它最有可能有一個main這樣的:

int main(int argc, char *argv[]) 

/* argv contains this. */ 
argv[0] == "a.out" 
argv[1] == "5" 
argv[2] == "ls" 
argv[3] == NULL /* Here is your terminator. */ 

所以,當你路過argv[2]execvp萬事具備,但數組開始於(開始於ls )。

7

execvp的第二個參數是char*的數組,它將成爲結果進程的argv。爲了使execvp知道該陣列有多長,最後的「真實」元素後面必須跟着NULL,例如,爲了通過{"foo", "bar"}作爲新的argv,第二個參數到execvp必須參考數組{"foo", "bar", NULL}。在你的情況下,由於argv數組傳遞到你的程序的main已經由它自己的NULL條目終止,所以你可以直接通過&argv[2]execvp而不必自己添加NULL