2016-11-21 57 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

回答