2016-06-08 55 views
0

我一直在研究一些C代碼來提供類似於shell的功能。到目前爲止,它可以運行大多數命令,如cat,ls,ls | grep ...等。在編寫代碼實現函數「cd」,「pwd」,「pushd」和「popd」之後,我一直在測試它。如果我寫「cd ..」或「cd anydir」,它將運行「chdir(anydir)」並返回到我的腳本命令提示符。 「CD」後進入任何命令後,它會返回該錯誤:C調用chdir後損壞的雙鏈表

*** Error in `./smshv4': corrupted double-linked list: 0x00000000018d5190 *** 

予分離此錯誤,而在一個不相關的變量重新分配存儲器以進行打印。我已經在錯誤產生的線上發表評論:

char * next_cmd(char *prompt, FILE *fp){ 
     fprintf(stderr,"in next_cmd\n"); 

     char *buf ; 
     int bufspace = 0; 
     int pos = 0; 
     int c; 

     printf("%s", prompt); 
     while((c = getc(fp)) != EOF) { 

       if(pos+1 >= bufspace){ 
         if (bufspace == 0){ 
         buf = emalloc(BUFSIZ); //Error occurs while calling this function 
         } else { 
           buf = erealloc(buf,bufspace+BUFSIZ); 
         } 
         bufspace += BUFSIZ; 
       } 

       /* end of command? */ 
       if (c == '\n') 
         break; 

       /* no, add to buffer */ 
       buf[pos++] = c; 
     } 

     if (c == EOF && pos == 0) 
       return NULL; 
     buf[pos] = '\0'; 
     return buf; 
} 

這個錯誤只發生在使用chdir運行任何函數之後。這是我如何我打電話的chdir的一個例子,當CD被作爲輸入:

if(strcmp(cmdStruct.commandTemp[0],"cd") == 0){ 
    if(cmdStruct.commandTemp[1] != NULL){ 
     if(chdir(cmdStruct.commandTemp[1]) == -1){ 
      perror("chdir"); 
      return -1; 
     } 
    } else { 
     fprintf(stderr,"cd failed. No directory given\n"); 
     return -1; 
    } 
} 

這個cd命令無法正常工作,因爲每當我運行它,因爲錯誤將在下一次我進入一個顯示命令。如果我cd到不同的目錄,運行任何接收錯誤,然後運行「pwd」(正在工作),它會顯示原始目錄(錯誤似乎在輸入一個命令後自行排除)。

如何解決損壞的雙鏈表問題?謝謝。

編輯:我調用命令提示,如下所示:

while ((cmdline = next_cmd(prompt, stdin)) != NULL){ //command prompt function is run 
    //if & sign detected, fork. otherwise run command as usual 
    if(hasBackgroundSign(cmdline) == 1){ 
     pid = fork(); 
     if(pid == 0){ 
      if ((arglist = splitline(cmdline)) != NULL ){ 
       result = execute(arglist); 
       freelist(arglist); 
      } 
      free(cmdline); 
      kill(getpid(), SIGKILL); 
     } else { 
      printf("%d\n",pid); 
     } 
    } else { 
     //if no & sign detected, run command as usual without forking 
     if ((arglist = splitline(cmdline)) != NULL ){ 
      result = execute(arglist); //execute function contains the chdir calls 
      freelist(arglist); 
     } 
     free(cmdline); 
    } 
} 
+0

「...回到我的腳本命令提示符」 - 哪個腳本?你爲什麼不展示它? – Olaf

+0

只需在Valgrind下運行您的shell並跟蹤所有報告的錯誤。 – Kaz

+0

而'emalloc' /'erealloc'不是標準功能。 – Olaf

回答

1

通過找到損壞的存儲位置,使用Valgrind的解決。 Valgrind稱之爲「8號無效」。解決這個問題後,問題就消失了。 感謝Leon提出了上述建議。