2010-09-28 43 views
3

根據exec reference,對exec(或通常的堆棧檢查可變參數函數)的調用需要參數列表末尾的(char*)NULL aka 0。然而,GCC抱怨以下代碼沒有足夠的變量來適應哨兵

char cmdFullPath[4096]; //yes this 4096 thing is bad coding practice 
... 
execl(cmdFullPath, (char*)NULL); 

//warning: not enough variable arguments to fit a sentinel 

任何人都知道什麼是錯的?

+0

可能重複:http://stackoverflow.com/questions/2050961/is-argv0-name-of-executable-an-accepted-standard-or-just-a-common-conventio – 2010-09-28 20:40:22

回答

9

引用說,原型是

execl(const char * path, const char * arg, ...) 

我讀到的2個參數+(的char *)NULL

類似:

execl(cmdFullPath, (const char*)NULL, (char*)NULL); 

從頁面:

#include <unistd.h> 

int main() { 
    execl("/bin/ls", "ls", "-l", (char *)NULL); 
    return 0; 
} 
+0

你對。暫時忘記第一個參數是強制性的(可執行文件名稱)。衛生署! – jameszhao00 2010-09-28 20:35:31

+0

如果arg列表類似於arg1 = val1,arg2 = val2,arg3 = val3等...或arg1 val1 arg2 val2 arg3 val3等等,該怎麼辦? – enthusiasticgeek 2012-03-12 21:31:28

2

它s通常將可執行文件的名稱作爲第一個參數傳遞

因此,如果您正在執行的可執行文件是「/ bin/ls」(根據您發佈的鏈接),那麼第一個參數是「ls」 THEN傳遞(char *)NULL作爲最後一個(即在這種情況下爲3rd)參數。

0

您必須傳遞至少三個參數。第二個是argv [0],所以它不能爲空。

execl(cmdFullPath, "", NULL)