0

我在 C 中做了一个简单的 minishell,它可以工作,除了cd命令。当我尝试运行它时,除了它创建一个永远不会真正结束的子进程之外,什么也没有发生。例如,cd在我的 minishell 中运行后,我需要输入exit两次才能退出 minishell,而不是标准的一次。代码:int调试=0;

void safeQuit(){
    if (debug==1)
      printf("INFO: Parent process, pid=%d exiting.\n", getpid());
    exit(0);
}

    int main(int argc,char** argv) 
    {
    int pid, stat;
    char * Array_arg[50]; 
    char command_line[200];//user input
    if (argc>1)
      if (strcmp(argv[1],"-debug")==0)
        debug=1;
    while (1){
      printf("[minishell]> "+debug);
      gets(command_line);
      if (strcmp(command_line,"exit")==0)
        safeQuit();
      char * subcommand=strtok(command_line," ");  //divides the string according to the spaces
      int i=0;   
      while (subcommand!= NULL)//insert to array
      {
        Array_arg[i]=subcommand;
        subcommand=strtok(NULL," ");
        i++;
      } 
  Array_arg[i]='\0';
      if (fork()==0){
        if (debug==1)
          printf("INFO: child process, pid = %d, executing command %s\n", getpid(), command_line);
        execvp(Array_arg[0],Array_arg); //execution of cmd
      }
      else{
        pid=wait(&stat);
  }
    }
}
4

1 回答 1

2

cd必须是内置的外壳,而不是外部实用程序。您想更改当前进程(shell 本身)的当前工作目录,而不是子进程的当前工作目录。调用chdir而不是分叉子进程。

另外,检查 execvp 是否有错误,并在exec失败后防御性地终止子进程。如果你这样做了,你会看到一个信息性错误:

... (child) ...
execvp(Array_arg[0], Array_arg);
perror("Error - exec failed"); // If we are here, we did *not* replace the process image
exit(0);
于 2013-05-21T16:40:12.620 回答