2015-01-29 6 views
4

execv*() 계열의 함수에 대한 인수가 char * const []인데 반해 execl*() 계열의 arg0...n args는 const char *입니까? 이것은 표준에서 실수 일 뿐이며 const char * const []이어야합니다. 그렇지 않으면 문자열이 배열의 경우 const가 아닌 const가 아닌 명시 적으로 전달 된 인수의 경우 문자열이되는 이유는 무엇입니까?execv *() 인수가 execl *()과 일치하지 않는 이유는 무엇입니까?

int execl(const char *path, const char *arg0, ... /*, (char *)0 */); 
    int execv(const char *path, char *const argv[]); 
    int execle(const char *path, const char *arg0, ... /*, 
      (char *)0, char *const envp[]*/); 
    int execve(const char *path, char *const argv[], char *const envp[]); 
    int execlp(const char *file, const char *arg0, ... /*, (char *)0 */); 
    int execvp(const char *file, char *const argv[]); 

답변

0

신뢰할 수있는 답변을 찾을 수 없지만 두 가지 호출 서명은 생성 방법 및 사용 방법에 따라 다릅니다.

execl*()의 경우 전달할 함수가 const char*으로 완전히 전달되었을 가능성이 있습니다. execl*()의 서명이 const char*이 아니면 컴파일러 경고가 표시됩니다.

의 경우에는 사용자가 작성한 배열이므로 문자열 값의 일정성을 유지하는 것이 중요하지 않습니다. 중요한 것은 execv*()이 포인터를 조작하지 않는다는 것입니다. 그렇지 않으면 마지막 요소를 수정하여 더 이상 NULL을 올바르게 가리킬 수 없게 될 수도 있습니다. 이는 필수 항목입니다.

누군가 내가 잘못했을 수있는 부분을 분명히하기 위해 사양을 더 잘 알고있을 것입니다.