【问题标题】:Making a shell in C, but can't get chdir to work?在 C 中制作 shell,但无法让 chdir 工作?
【发布时间】:2016-03-20 21:24:45
【问题描述】:

我正在用 C 语言编写一个 shell,它应该实现多个命令,其中之一是更改目录命令。要更改目录,我使用 chdir(),但每次运行代码时,都会出现分段错误(核心转储)错误。 这是我的代码:

.....
........
char *shell;
while((shell=readline("shell> ") )){
char *cmd = strtok(shell," ");

if(strcmp(cmd,"ls")==0)
 {
    //do something
 }
 else if(strcmp(cmd,"print")==0)
 {
   //do something
 }
else if(strcmp(cmd,"cd")==0){

            char *directory = strtok(NULL," ");

            if(chdir(directory)==-1){
                printf("Error\n");
            }
            else
            {
                printf("changed directories!");
            }


        }
      add_history(shell);
 }

我想我可能错误地使用了 strtok?

感谢任何帮助,谢谢:)

【问题讨论】:

  • 您是否尝试过添加一些调试输出以查看它在哪一行崩溃?
  • 看起来您正在对“目录”执行 strtok,然后将“目录”用于 chdir 命令 - 这是故意的吗?此外,strtok 中的输出在第一次迭代中将是“cd”,您需要再次调用 strtok,并使用“NULL”作为字符串输入来获取下一个分隔字符串。
  • 如果你的程序崩溃了,你应该在调试器中运行它来捕捉崩溃。这会告诉你在哪里它崩溃了,让你检查函数调用堆栈,甚至让你走上调用堆栈,这样你就可以找到你的代码(如果调试器还没有停在那里)。当您在代码中找到崩溃时,您可以检查变量的值以帮助您找出可能导致崩溃的原因。如果您仍然无法弄清楚,请更新您的问题,告诉我们崩溃的位置以及所有相关变量的值。
  • 好的,这是我所做的更改: else if(strcmp(command,"cd")==0){ char *com = strtok(c​​ommand," ");字符 *dir = strtok(NULL," "); if(chdir(dir)==-1){ perror("错误:"); //printf("错误:无法更改目录\n"); } else { printf("成功更改目录\n");现在,每当我运行它时,我都会收到此错误:错误:错误地址。无论我传递给它什么,它都会显示错误的地址。我尝试将 .. 传递给它以向上一个目录,但这也给出了错误的地址错误
  • 将代码添加到问题中。不要忘记用换行符结束输出行。您没有检查dir 是否为空——考虑到崩溃,它可能是。别忘了,当你输入cd 回家时,没有空格。

标签: c linux shell command-line command


【解决方案1】:

这个

    char *directory = strtok(cmd," ");

应该是

        char *directory = strtok(NULL," ");

当您调用strtok() 获取下一个令牌时,您将NULL 传递给它。

此外,strtok() 不可重入。因此,即使您的计划是标记不同的字符串,您也不能使用它。您可以在 POSIX 系统上使用 strtok_r()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多