cd(C)的Minishell问题

我在C中制作了一个简单的minishell,它的工作原理,除了cd命令。 当我尝试运行它时,没有任何事情发生,除了它创建一个永远不会真正结束的子进程。 例如,在我的minishell中运行cd ,我需要输入两次退出以退出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);