我正在尝试在C中实现一个简单的shell,并且我的程序在用户有机会输入任何命令之前导致无限循环并创建大量新进程/打印Myshell>
。我似乎无法找到一种方法来阻止这种情况,如果有人能帮助那就太好了! (未将#include
标题粘贴在顶部
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;
}
答案 0 :(得分:1)
因为您正在使用fgets而不是命令行参数将命令读入缓冲区所以argv[argc]
的{{1}}是错误的 - 未定义的行为。
如果未传递任何额外的命令行参数,则argc > 1
是您的程序名称,argv[0]
为NULL。索引到argv[1]
的值大于1会导致数组超出索引问题。
而不是声明argv[]
和argv[]
作为主函数参数在main中声明为正式变量,如:
argc
您的代码中还有一个更正:更改:
int argc;
char* argv[MAX]; // max number of argument can be pass to your shell
as
int *status;
并相应地纠正
int status;
as
pid = wait(status);