我一直在研究一些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);
}
}
「...回到我的腳本命令提示符」 - 哪個腳本?你爲什麼不展示它? – Olaf
只需在Valgrind下運行您的shell並跟蹤所有報告的錯誤。 – Kaz
而'emalloc' /'erealloc'不是標準功能。 – Olaf