2012-05-04 3 views
23

execvp는 이렇게 정의된다execvp에 대한 argv 매개 변수가 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[] 배열하여 문자열 것들 배열 점은 제외하고, 실행 함수 중 하나를 호출하여 수정되지 않는다 할 공정 이미지 교체의 결과.

누락 된 (또는 잘못 배치 된) const은 단순히 역사적인 괴상한 것 같습니다.

+5

누락 된'const'는 역사적인 이상한 것이 아닙니다. 오히려 캐스팅없이 C에서'char ** '에서'const char * const *'로 변환 할 수 없기 때문입니다 (하지만 C++에서는 할 수 있습니다). –

+2

@Adam : 맞아. 게시물의 첫 번째 질문에 대한 답변입니다. 나는 그것에 간격을두고있다 : http://c-faq.com/ansi/constmismatch.html –

+1

exec에 대한 POSIX 스펙의 끝 부분에있는 RATIONALE 섹션을 참조하라. 그것은 const 누락의 선택을 설명합니다. –

-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

'포인터 char에 대한 상수'는 의미가 없습니다. – EJP

+0

char에 대한 포인터 상수를 의미했습니다. 나는 문법 실수를 바로 잡았다. –

+0

그러면 오류/경고가'execvp()'줄에서 할당 문으로 옮겨집니다 (매우 관대 한 컴파일러가 아니면). –