1

我正在尝试在 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;
}
4

1 回答 1

1

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

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

而不是在 main 中声明argv[]argc作为 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);
于 2013-10-09T18:39:25.883 回答