gpt4 book ai didi

c - 在 linux 中使用 C 的简单 shell 实现,fork 导致无限循环

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:01:50 25 4
gpt4 key购买 nike

我试图在 C 中实现一个简单的 shell,但我的程序导致无限循环并在用户有机会输入任何内容之前创建大量新进程/打印 Myshell>命令。我似乎无法找到一种方法来防止这种情况,如果有人可以提供帮助那就太好了! (没有在顶部粘贴 #include header

int main(int argc, char *argv[]){

char buffer[512];
int *status;
size_t nargs;
pid_t pid;
char delim[] = "\n";

while(1){

pid = fork();
if(pid){

printf("Myshell> ");
fgets(buffer, 512, stdin);
//parse(buffer, argv);

argv[0] = strtok(buffer, delim);
for(argc=1; argv[argc-1]; argc++){
argv[argc] = strtok(NULL, delim);
}

if(!strcmp(argv[0], "exit"))
exit(0);

printf("Waiting for child (%d)\n", pid);
pid = wait(status);
printf("Child (%d) finished\n", pid);
exit(0);
}else{
if(execvp(argv[0], argv)){
printf("error");
exit(1);
}else{
exit(0);
}
}
}

return 0;
}

最佳答案

因为您正在使用 fgets 而不是从命令行参数将命令读入缓冲区所以 argv[argc] 对于 argc > 1 是错误的 - 未定义的行为。

当您不传递任何额外的命令行参数时,argv[0] 是您的程序名称,argv[1] 是 NULL。为大于 1 的值索引到 argv[] 会导致数组超出索引问题。

不是将 argv[]argc 声明为 main 函数参数,而是在 main 中声明为正式变量,例如:

int argc;
char* argv[MAX]; // max number of argument can be pass to your shell

在你的代码中再进行一次整改,更改:

int *status;

作为

int status;

并相应地纠正

pid = wait(status);

作为

pid = wait(&status);

关于c - 在 linux 中使用 C 的简单 shell 实现,fork 导致无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19280001/

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