我正在尝试用 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) finishedn", pid);
exit(0);
}else{
if(execvp(argv[0], argv)){
printf("error");
exit(1);
}else{
exit(0);
}
}
}
return 0;
}
因为您使用 fget 而不是从命令行参数将命令读取到缓冲区中 所以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);