gpt4 book ai didi

c - cd (C) 的 Minishell 问题

转载 作者:太空宇宙 更新时间:2023-11-04 08:56:35 28 4
gpt4 key购买 nike

我用 C 做了一个简单的 minishell,它可以工作,除了 cd 命令。当我尝试运行它时,除了它创建了一个永远不会真正结束的子进程之外,什么也没有发生。例如,在我的 minishell 中运行 cd 后,我需要键入 exit 两次以退出 minishell,而不是标准一次。代码: 内部调试=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而不是 fork 子进程。

另外,检查 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);

关于c - cd (C) 的 Minishell 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16675094/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com