【问题标题】:Making own shell in C用C制作自己的shell
【发布时间】:2011-07-03 00:36:10
【问题描述】:

我正在尝试用 C 语言制作自己的 shell,但在使用 strtok 时遇到了问题。我用它来正确解析输入中的命令和参数,但我无法让它解析路径(它当前是段错误)。一旦我正确解析了路径,我应该能够在每个部分上调用 execlp 并相应地分叉进程。任何见解将不胜感激,代码如下。如果您认为我可以做得更好,也可以随意评论样式选择。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

void parse(char *, char *);
void process(char *, char *, int);

int main(int argc, char *argv[]) {
  char *command;
  char *path;
  char buffer[1024];
  command = (char *)malloc(sizeof(char));
  path = (char *)malloc(sizeof(char));
  int loop = 1;
  while(loop == 1){
    path = getenv("MYPATH");
    if(path == NULL)
      path = "/bin#.";
    printf("($MYPATH is %s)\n", path);

    printf("myshell$ ");
    command = fgets(buffer, 1024, stdin);
    printf("Buffer: %s", buffer);
    printf("Command: %s", command);

    if(strcmp(command,"exit\n") == 0 || strcmp(command, "quit\n") == 0){
      loop = 0;
      printf("Program Terminated\n");
    }
    parse(command, path);
  }
  return 0;
}

void parse(char *command, char *path){
  char *argv;
  int argNum = 0;
  argv = strtok(command, " ");
  while(argv != NULL){
    printf("%s %d\n", argv, argNum);
    argv = strtok (NULL, " ");
    argNum++;
    }
  printf("Calling...\n");
  process(argv, path, argNum);
  printf("Called\n");
}

void process(char *argv, char *path, int argNum){
  char *pathPiece;
  int pathNum = 0;
  pathPiece = strtok(path, "#");
  while(pathPiece != NULL){
    printf("%s %d\n", pathPiece, pathNum);
    pathPiece = strtok(NULL, "#");
    pathNum++;
  }
}

【问题讨论】:

  • 当它出现段错误时,你输入了什么?
  • Don't cast malloc in C。它隐藏了诸如此类的错误。

标签: c shell operating-system posix


【解决方案1】:

您正在设置指向只读内存位置的路径,并且在strtok 尝试对其进行标记时调用strtok 可能是您的问题的原因(即在其中某处写入空字符) .

你可能需要这样的东西:

char path[1024];

并致电strcpy 喜欢:

strcpy(path, getenv("MYPATH"));

strcpy(path, "/bin#.");

我强烈建议您阅读 C 中的字符串处理。

【讨论】:

  • 谢谢,帮了大忙。我确实知道字符串函数,但有时我的 C++ 会偷偷溜进来(我对 C 比较陌生)而且我很难看到错误。
【解决方案2】:

以下不会有预期的效果

path = "/bin#.";

改用strcpy( path, "/bin#." );

而且,正如 larsmans 所说,修复 malloc 以便为命令的大小分配足够的字节。

另外,如果您要严格编译它的 C,那么在您所在的位置声明 loop 整数时应该会出现编译错误。

【讨论】:

  • 谢谢,我应该注意到这一点(有时我的 C++ 偷偷溜进来,我对 C 比较陌生)。我认为新的 C 标准现在允许您在执行代码后声明整数,但我可能是错的。
  • @fossuser:是的,现代 C 确实允许在可执行代码之后声明变量。但是,我们中的许多 C 程序员都忘记了这一点,因为我们必须维护使用史前编译器编写的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
  • 1970-01-01
  • 2012-02-28
相关资源
最近更新 更多