C 调用 chdir 后损坏的双链表
C Corrupted double-linked list after calling chdir
我一直在编写一些 C 代码以提供类似于 shell 的功能。到目前为止,它可以 运行 大多数命令,如 cat、ls、ls | grep ...等写了实现"cd"、"pwd"、"pushd"和"popd"等功能的代码后,一直在测试。如果我写 "cd .." 或 "cd anydir" 它将 运行 "chdir(anydir)" 和 return 返回到我的脚本命令提示符。在"cd"之后输入任何命令后,都会return报错:
*** 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] = '[=11=]';
return buf;
}
此错误仅在我 运行 使用 chdir 的任何函数之后发生。下面是我如何在 cd 作为输入时调用 chdir 的示例:
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);
}
}
已通过使用 Valgrind 找到损坏的内存位置来解决。 "Invalid write of size 8" 被 Valgrind 调用。解决这个问题后,问题就消失了。
感谢 Leon 在上面提出这个建议。
我一直在编写一些 C 代码以提供类似于 shell 的功能。到目前为止,它可以 运行 大多数命令,如 cat、ls、ls | grep ...等写了实现"cd"、"pwd"、"pushd"和"popd"等功能的代码后,一直在测试。如果我写 "cd .." 或 "cd anydir" 它将 运行 "chdir(anydir)" 和 return 返回到我的脚本命令提示符。在"cd"之后输入任何命令后,都会return报错:
*** 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] = '[=11=]';
return buf;
}
此错误仅在我 运行 使用 chdir 的任何函数之后发生。下面是我如何在 cd 作为输入时调用 chdir 的示例:
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);
}
}
已通过使用 Valgrind 找到损坏的内存位置来解决。 "Invalid write of size 8" 被 Valgrind 调用。解决这个问题后,问题就消失了。 感谢 Leon 在上面提出这个建议。