我无法退出我的计划

时间:2015-01-31 16:57:52

标签: c

我正在尝试像bash这样的命令解释器,我有一点问题。

当我执行像ls / cat / grep这样的现有命令时,它没有问题,但是当我尝试执行像qsdjhkoqd这样的命令时,它会说命令未找到,如果我尝试在它之后退出,它将不会退出。

例如,如果我做了4个不好的评论,我将不得不做5个退出以退出我的程序。 我知道这肯定是一个进程问题,但我不知道如何解决它,你能告诉我我错在哪里吗?

谢谢!

int im_your_father(t_struct *tool, char **env, char **argv)
{
  int   ret;

  ret = 0;
  if (tool->command.pid == 0)
    {
      ret = execve(tool->command.command, argv, env);
    }
  else
    wait(NULL);
  return (ret);
}

int execute_path(t_struct *tool , char **env , 
             char **argv, t_first_elem *list)
{
  int   i;
  int   ret;

  tool->command.pid = fork();
  (void)list;
  i = -1;
  if (my_strcmp("ls", argv[0]) == 0)
    {
      while (argv[++i] != NULL)
    ;
      argv[i] = my_strdup("--color=auto");
      argv[++i] = NULL;
      i = -1;
    }
  while (tool->path[++i] != NULL)
    { 
      tool->command.command = my_strdup_mod(tool->path[i], 
                        my_strlen(tool->command.line));
      my_strcat(tool->command.command, "/");
      my_strcat(tool->command.command, argv[0]);
      ret = im_your_father(tool, env, argv);
      if (ret != -1)
    return (0);
    }
  if (tool->command.pid == 0)
    {
      my_putstr("son alive");
    }
  else
    {
      printf("%d\n", tool->command.pid);
      wait(NULL);
    }
  my_putstr(argv[0]);
  my_putstr(":   command not found\n");
  return (0);
}

1 个答案:

答案 0 :(得分:0)

我认为问题主要出在以下几个方面:

if (tool->command.pid == 0)
{
    ret = execve(tool->command.command, argv, env);
}

首先,不需要从execve()捕获返回值。如果成功,它永远不会回来;如果它完全返回,则失败。

其次,你需要考虑接下来会发生什么,而简短的回答是你现在有两个过程,两个过程都认为它们是你的shell。你现在有两个过程试图阅读你的输入,他们争吵谁得到每个角色,结果是一团糟,就像人类的孩子争吵轮到使用一个受宠的玩具。

大多数情况下,特别是在shell中,如果execve()失败,您可能希望在产生错误消息后退出:

if (tool->command.pid == 0)
{
    execve(tool->command.command, argv, env);
    fprintf(stderr, "failed to execute %s (%s)\n", tool->command.command, strerror(errno));
    exit(127);
}

确切的退出状态是可以协商的;我通常只使用1,但POSIX标准在未能执行命令时会规定exit statuses

  

如果未找到命令,则退出状态应为127.如果找到命令名称,但它不是可执行实用程序,则退出状态应为126.