繁体   English   中英

cd(C)的Minishell问题

[英]Minishell problems with cd (C)

我在C中做了一个简单的minishell,除了cd命令之外它都可以工作。 当我尝试运行它时,没有任何事情发生,除了它创建一个永远不会真正结束的子进程。 例如,在我的minishell中运行cd ,我需要键入exit两次以退出minishell,而不是标准的一次。 代码:int debug = 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);
  }
    }
}

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

另外, 检查execvp错误和失败的高管防守后终止了孩子。 如果你这样做,你会看到一个信息错误:

... (child) ...
execvp(Array_arg[0], Array_arg);
perror("Error - exec failed"); // If we are here, we did *not* replace the process image
exit(0);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM