2012-05-04 35 views
23

execvp被這樣定義:爲什麼argv參數不是execvp而是const?

int execvp(const char *file, char *const argv[]); 

這排除代碼如此被使用:

const char* argv[] = {"/bin/my", "command", "here", NULL}; 
execvp(argv[0], argv); 

這是一個意外遺漏? const_cast是否安全?或者做一些execvp實現實際上在該內存上塗寫?

+3

儘管'exec *'系列函數不修改POSIX規範中提到的參數,請注意,在Windows上,['CreateProcess'需要可寫命令行](http://blogs.msdn.com /b/oldnewthing/archive/2009/06/01/9673254.aspx)。 –

回答

7

的POSIX規範說(http://pubs.opengroup.org/onlinepubs/009604499/functions/exec.html):

指針的argv[]envp[]陣列和串到這些陣列點不得通過調用修改以exec函數之一,除了作爲替換過程映像的後果。

我認爲失蹤(或錯位) const只是一個歷史古怪。

+5

缺少'const'不是歷史古怪;相反,這是因爲在C中沒有強制轉換(但你可以*在C++中),你不能從'char **'轉換爲'const char * const *'。 –

+2

@亞當:對。這是該帖子第一個問題的答案。我對此有所瞭解:http://c-faq.com/ansi/constmismatch.html –

+1

另請參閱POSIX規範中對exec的最後部分的RATIONALE部分。它解釋了常量省略的選擇。 –

-1

我遇到過這種情況。由於execvp()具有char *const作爲第二個參數,這意味着它接受一個指向char的常量指針。因此,如果您將它傳遞給指針char,它將能夠將指針char轉換爲指向char的常量指針。所以,與其宣稱它

const char* argv[] = {"/bin/my", "command", "here", NULL}; 

嘗試

char* argv[] = {"/bin/my", "command", "here", NULL}; 

,它將接受argv[]沒有問題。

+0

'常量到指針字符'是沒有意義的。 – EJP

+0

我的意思是指向char的指針常量。我繼續糾正語法錯誤。 –

+0

這只是將錯誤/警告從'execvp()'行移動到賦值語句(除非您有一個非常寬鬆的編譯器)。 –

相關問題