2016-11-21 29 views
0

只是爲了闡述標題,我變得很perodic,隨機壞地址時execvp()被調用。C++的定製外殼定期錯誤地址

我可以重複使用納米,CD,每過一段時間我會用一個錯誤的地址被命中。

我使用一個字符串矢量,換弦的載體,一個const char **,並在最後追加空。看起來好像null並不總是被讀取。

任何幫助表示讚賞。

代碼以供參考:

int parse::sh_execute() 
{ 
     const char **argv = new const char* [tokens.size()+1]; 
     for (int i = 0; i < tokens.size(); ++i) 
     { 
       argv[i] = tokens[i].c_str(); 
     } 

     argv[tokens.size()+1] = NULL; 


     pid_t pid, wpid; 
     pid = fork(); 
     int status; 


     if (pid < 0) 
     { 
       perror("fork error"); 
       exit(EXIT_FAILURE); 
     } 
     else if(pid == 0) 
     { 
       //child process 
       if(execvp(argv[0], (char **)argv)== -1) 
       { 
         perror("Child process error"); 
       } 
       exit(EXIT_FAILURE); 
     } 
     else 
     { 
       do 
       { 
        wpid = waitpid(pid, &status, WUNTRACED); 
       } 
       while (!WIFEXITED(status) && !WIFSIGNALED(status)); 
     } 
     return 1; 

} 

    int parse::sh_cd() 
{ 
     if (tokens.size() == 1) 
     { 
       std::cout << "Error: No argument for cd" << std::endl; 

     } 
     else 
     { 
       int rc = chdir(tokens[1].c_str()); 
       if (rc < 0) 
       { 
         printf ("Error changing directory: %s\n",strerror(errno)); 
       } 
     } 
     return 1; 
} 
+1

'的argv [tokens.size()+ 1]'。這是保護區超限。 –

+0

@牛米。我沒有正確地爲argv分配足夠的空間嗎?等等,我明白你的意思。 – MipsMoreLikeWhips

+0

@牛米。感謝您的快速解決。 – MipsMoreLikeWhips

回答