在 Linux 中使用 C 实现简单的 shell,分叉导致无限循环



我正在尝试用 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);

最新更新